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)