Swiftでは構造体(struct)をとクラス(class)の使い分けの話。
Swiftでは構造体とクラスではけっこう同じ使い方ができてしまうので混同する。
構造体のポイント(クラスとの違い)
- 継承ができない
- 値渡しである(参照渡しではない)
- データが多いと速度が落ちる
ここらへんをポイントとする。
継承ができない
これは言葉のままで継承できない。
継承が必要な場合は迷わずクラスを使えば良い。
値渡しである(参照渡しではない)
言葉で説明するのが難しいので、実際のコードでの違いを見てみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// 構造体 struct UserStruct { var age: Int init (age: Int){ self.age = age } } // クラス class UserClass { var age: Int init (age: Int){ self.age = age } } var userStruct1 = UserStruct(age: 30) var userStruct2 = userStruct1 // 新しい構造体として代入されるので、userStruct1には影響しない userStruct2.age = 32 print(userStruct1.age) // 30 print(userStruct2.age) // 32 var userClass1 = UserClass(age: 30) var userClass2 = userClass1 // クラスは参照型なので、userClass1に影響する userClass2.age = 32 print(userClass1.age) // 32 print(userClass2.age) // 32 |
ちょっと長いが勘弁。やってることは単純で、構造体とクラスを2つ作って代入している。
- 構造体の場合は新しい構造体を生成してコピーしてる(clone)してるので、別物になる
- クラスの場合は、参照をコピーしてるので、同じものを見ている
ので、出力結果が異なってくる。
言葉からもわかるように構造体のが辛いことをしている。
データが多いと速度が落ちる
と、上の結果がこれである。
ので、繰り返し処理とか負担のかかる処理で使うのは向かない。
ので、結論としては
- データがそんな大きくない、継承が必要ないもの
- 値渡しが良い
てのは構造体にすれば良い(と思うよ