LoginSignup
2

More than 1 year has passed since last update.

classとstructについて【Swift】

Last updated at Posted at 2020-11-26

はじめに

classstructの違いについて理解が薄かったので、備忘録としての投稿させていただきます。

classstructの定義

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
    }
}

classstructの使い分け

1. classstructの大きな違い

  • structは値型(継承できない、内部を直接書き換えることは不可)
  • classは参照型(継承できる、内部の書き換えるが可能)

2. structを使うパターン

  • 小さくて単純なデータをカプセル化をしたい場合
  • 参照渡しより値渡し(コピー)が良い場合
  • 継承が必要ない場合

3. structを使わない方が良いパターン

  • データが大きい
  • プロパティが多い

理由としては、以下の2つ

  • 構造体は変数にセットする度にコピーされるため、データが大きいと処理時間が遅くなる
  • 構造体はスタック領域に確保されるため、データが大きいと溢れる可能性が高くなる なので、APIやDBの取得データなどは構造体ではなく、クラスで作成したほうがよい。

4. 比較詳細

class struct
プロトコル実装  ○   ○ 
プロパティ(格納型)  ○   ○ 
プロパティ(算出型)  ○   ○ 
タイププロパティ(格納型)  ✕   ○ 
タイププロパティ(算出型)  ○   ○ 
メソッド  ○   ○ 
タイプメソッド  ○   ○ 

5. 補足

タイププロパティ

すべてのインスタンスが利用できる(C の static 定数のような)定数プロパティ、あるいは特定の型のすべてのインスタンスにグローバルな値を保管する(C の static 変数のような)変数プロパティのように、その型のすべてのインスタンスに共通の値を定義するのに役に立つ。

タイプメソッド

型自体で呼び出せるメソッド。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2