Swift入門メモ -構造体-

22 構造体

dotinstall.com

構造体とは

  • クラスとほぼ似た感じでプロパティやメソッドをまとめたデータ型
  • プロトコル、イニシャライザーなども使える
  • 構造体の宣言はstruct

クラスとの違い

  • メソッドの中で自信のプロパティを書き換えることが出来ない
    • 書き換える場合は明示的に指示
    • funcの前にmutating
  • 継承が出来ない
  • コピーするときの挙動が違う
    • クラス:参照渡し
      • メモリを効率的に使うため
    • 構造体:値渡し
      • わかりやすいが、大きな構造体だとコピーするたびにメモリを圧迫するので注意が必要
struct UserStruct {
    var name: String
    var score: Int = 0
    init(name: String) {
        self.name = name
    }
    mutating func upgrade() {
        score++
    }
}


class User {
    var name: String
    var score: Int = 0
    init(name: String) {
        self.name = name
    }
    func upgrade() {
        score++
    }
}

// ====クラスのインスタンスコピー
var hoge = User(name: "Hoge")
var hoge2 = hoge // hoge2にはhogeの実体を指し示す参照先がコピーされる
hoge2.name = "hoge2" // hoge2のnameプロパティ書き換え
hoge.name // hoge2 に変わる

// ※hogeとhoge2は全く同じデータを指し示している


// ====構造体のインスタンスコピー
var huga = UserStruct(name: "Huga")
var huga2 = huga // huga2にはhugaの値をそのまま丸ごとコピーしている
huga2.name = "huga2" // huga2のnameプロパティ書き換え
huga.name // Huga のまま(hugaとhuga2は別物だから)

クラスと構造体の使い分け

  • 継承が必要、大きなデータを扱う -> クラス
  • シンプルなデータ -> 構造体