はじめに
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 変数のような)変数プロパティのように、その型のすべてのインスタンスに共通の値を定義するのに役に立つ。
タイプメソッド
型自体で呼び出せるメソッド。