🐨
Swiftのstructとclassの違い
ここ最近Swiftを触る機会がめちゃくちゃ増えました。
平然とstructを書いてましてたが、
- そもそもstructとは何か
- classがあるのにstructがよく使われてる理由は何か
- どのように使い分けたらいいか?
を調査してみました。
そもそもstructって
簡単に言えば「独立した値のかたまり」です。
json的な感じで、データ群を構造体としてひとまとまりに管理したい時に使用します。
じゃあclassとは何が違うの
でもそれだとclassも同じような意味合いで使用されます。
じゃあ何が大きく違うのかというと、structは値型でclassは参照型である点です。
structは変数に代入したときに値がコピーされます。二つの変数にstructのデータを代入して片方の値を変更しても、もう片方の変数は影響を受けません。
データを使い回すのではなくて、コピーして使っていきます。
classは参照型なので片方を変更した場合、もう片方も変更されてしまいます。
また、structはclassみたいに別のclassに継承させることができません。
それぞれのstructが単体として孤立しています。
まとめると、structは「継承できないclass」です。
ですので、classみたいに抽象的なクラスを継承しながら各機能別に派生させていくということはできまません。
また、変数に代入したらコピーされますので別の変数に影響を与えることがありません。
どっちの方がよく使われるのか
イミュータブルに扱えるstructの方がメジャーのようです。
ただデータがコピーされていく分、サイズが大きくなっていくとコピーデータがかさんでいってしまいますので注意が必要。
と思ってたのですが、structにはCopy on Write (COW) と呼ばれる最適化が用意されており、実際には不必要に大規模なコピーが行われない仕組みが多いとのこと。
どのように使い分けるべきか
classを使うケース
- SwiftDataで定義するモデル
- ベースのクラスを継承させて色々派生させたい・多態性を利用したい時
- Objective-Cと互換性を持たせたい時
structを使うケース
- UIコンポーネントの定義
- APIレスポンスなどのJSONデータ
- 継承・ライフサイクルが不要なデータ群
Discussion