はじめに
class
とstruct
の違いについて理解が薄かったので、備忘録としての投稿させていただきます。
class
とstruct
の定義
struct
の場合
struct Human {
let name: String
let age: Int
}
class
の場合
class Human {
let name: String
let age: Int
// プロパティを初期化しないと下記メッセージのように怒られます。
// Class 'Human' has no initializers
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class
とstruct
の使い分け
1. class
とstruct
の大きな違い
-
struct
は値型(継承できない、内部を直接書き換えることは不可) -
class
は参照型(継承できる、内部の書き換えるが可能)
2. struct
を使うパターン
- 小さくて単純なデータをカプセル化をしたい場合
- 参照渡しより値渡し(コピー)が良い場合
- 継承が必要ない場合
3. struct
を使わない方が良いパターン
- データが大きい
- プロパティが多い
理由としては、以下の2つ
- 構造体は変数にセットする度にコピーされるため、データが大きいと処理時間が遅くなる
- 構造体はスタック領域に確保されるため、データが大きいと溢れる可能性が高くなる
なので、APIやDBの取得データなどは構造体ではなく、クラスで作成したほうがよい。
4. 比較詳細
class | struct | |
---|---|---|
プロトコル実装 | ○ | ○ |
プロパティ(格納型) | ○ | ○ |
プロパティ(算出型) | ○ | ○ |
タイププロパティ(格納型) | ✕ | ○ |
タイププロパティ(算出型) | ○ | ○ |
メソッド | ○ | ○ |
タイプメソッド | ○ | ○ |
5. 補足
タイププロパティ
すべてのインスタンスが利用できる(C の static 定数のような)定数プロパティ、あるいは特定の型のすべてのインスタンスにグローバルな値を保管する(C の static 変数のような)変数プロパティのように、その型のすべてのインスタンスに共通の値を定義するのに役に立つ。
タイプメソッド
型自体で呼び出せるメソッド。