Swift クラス 構造体 違い

構造体は値渡し

下記を考えなくていいので大変都合が良い。

  • ARC
  • Reference counting
  • weak and strong リファレンス

Objective-CはARCで結構難しくなる。

画面作成時はObjective-Cは楽だけど、、

構造体はヒープ領域に保存されるので、メモリ的も効率的

ヒープ領域とは?

メモリを自由に出し入れ可能な領域 アプリ起動時にOSが割り当ててくれる。

どちらの領域を使ったほうが良いかは意見が分かれると思います。 ただ、エラーが少ないのはヒープ領域だと思います。 AppleもStructへの変更を進めているし、ハードの性能が上がっている現在、モデルを作るときは、構造体のほうが良いような気がします。

スタック領域

スタック領域は、確保したのとは逆の順番で解放する。 A、B、Cの順に確保した場合、解放するのはC、B、Aの順となります。 ファースト・イン、ラストアウトという。 積み上げたお皿をイメージすると良い。 クラスなどは、入れ子になっていて、最後に追加したものは保存期間が少ないので、継承とかに適している。

クラス 構造体の違い具体例

構造体はコピー 

//Diaryは構造体 struct
var d = Diary() 

//copyを作った
var c = d

クラスの場合

var vc = LoginViewController()

//同じメモリアドレスを参照している
//参照カウンタ Reference Conting が一つ増えている
var vc2 = vc

構造体の例

幾何学的図形のサイズで、width プロパティと height プロパティがあり、共に Double 型
一連の範囲を参照する手段で、start プロパティと length プロパティがあり、共に Int 型
3D 座標系の点で、x, y, z プロパティがあり、すべて Double 型

JSONを読み込むクラスや、自分が作成したModelは全て構造体にしておくとよい

メモリ的にも構造体が良い。

ただ、クラスにも、継承できるなどメリットもあるので、基本 画面と接続する、ViewControllerは全てクラスを利用する

Classと構造体については、下記を読んでおくこと

Structures and Classes — The Swift Programming Language (Swift 5.4)