SwiftUIの学習をしているとclassではなくstructをよく目にしますよね。今回はこの2つの違いと使い分けについて説明していきます。
classとは
多くのエンジニアはstructよりclassの方が馴染みがあるのではないでしょうか。
classはいわゆる参照型と呼ばれるものです。参照型のデータにアクセスするとデータそのものにアクセスすることになります。以下のようにhuman1をhuman2にコピーしても、同じデータを共有しているに過ぎず、human2に対する変更はhuman1にも影響します。
class Human {
var name = ""
}
var human1 = Human()
human1.name = "佐藤"
var human2 = human1
human2.name = "鈴木"
print(human1.name) // 鈴木
print(human1.name) // 鈴木
structとは
classが参照型であるのに対し、structは値型と呼ばれるものになります。値型は作成した瞬間のその時の値にアクセスすることができます。以下のようにhuman1をhuman2にコピーすると、それらは別々のものとして扱われるようになります。
struct Human {
var name = ""
}
var human1 = Human()
human1.name = "佐藤"
var human2 = human1
human2.name = "鈴木"
print(human1.name) // 佐藤
print(human1.name) // 鈴木
使い分け方
それぞれに違った特徴があるのがわかったと思いますが、ではどう使い分けたらいいでしょうか?
その答えはAppleがここに用意してくれていました。
アプリに新しいデータ型を追加するときに意味のあるオプションを選択するために、次の推奨事項を検討してください。
・基本的にはstructを使用する。
https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes
・Objective-Cの相互運用性が必要な場合は、classを使用する。
・データのIDを制御する必要がある場合は、classを使用する。
・継承をモデル化し共有するために、structとprotocolを使用する。
上記のサイトに詳しく説明がありますので、ここでは軽く説明します。
基本的にはstructを使用する
Swiftのstructには多くの機能が含まれており、また、Swift標準ライブラリの多くはstructで作られています。
structを使用するとアプリの状態全体を考慮することなくコードの一部について推論するのが簡単になります。
Objective-Cの相互運用性が必要な場合は、classを使用する
Objective-CとSwiftを併用する場合は、classとclass継承を使用してデータをモデル化する必要があります。
データのIDを制御する必要がある場合は、classを使用する
classは参照型のため、IDの概念が組み込まれています。これは全く同じ値を持つデータであっても、インスタンスが違えば恒等演算子(===
)によって異なると見なされることを意味します。なのでIDでの制御が必要な場合はclassを使用しましょう。逆に、IDでの制御が必要ない場合はstructを使用しましょう。
継承をモデル化し共有するために、structとprotocolを使用する
structとprotocolはprotocolから継承できますが、classから継承することはできません。しかし、classはprotocolを継承することができます。なので、
最後に
上記のようなルールに則ってstructとclassを正しく使い分けるようにしましょう。
コメント