【簡単に説明】classとstructの違いとは?どう使い分ける?【Swift】

Swift

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を使用する。
・Objective-Cの相互運用性が必要な場合は、classを使用する。
・データのIDを制御する必要がある場合は、classを使用する。
・継承をモデル化し共有するために、structとprotocolを使用する。

https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes

上記のサイトに詳しく説明がありますので、ここでは軽く説明します。

基本的には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を正しく使い分けるようにしましょう。

コメント

タイトルとURLをコピーしました