Swiftの構造体は、クラスと非常に似ているが、オブジェクトをコピーした時の挙動に大きな違いがある。
構造体は値型でクラスは参照型
構造体の場合、変数Aに入った構造体を変数Bに代入すると、変数Aのコピーが生成され新たな構造体として代入される。
一方クラスの場合、同じように変数Aのクラスを変数Bに代入した時、複製されず変数Aの参照が代入される。
では例を見ていこう。
まずはクラスの場合。
class ShirtClass { var size: String = "M" var color: String = "red" } let cShirt1 = ShirtClass() let cShirt2 = cShirt1 cShirt2.color = "blue" print("\(cShirt1.size):\(cShirt1.color)") // M:blue
cShirt1のcolorはデフォルトでredとなっており、cShirt2にコピーした後、cShirt2のcolorをblueに書き換えている。
ここでコピー元のcShirt1のプロパティをprint文で確認すると、blueに書き換わっておりクラスが参照型であることが分かる。
次に構造体の例を見てみよう。
struct ShirtStruct { var size: String = "M" var color: String = "red" } let sShirt1 = ShirtStruct() var sShirt2 = sShirt1 sShirt2.color = "blue" print("\(sShirt1.size):\(sShirt1.color)") // M:red
先ほどのクラスの例と同じ処理をやってみるが、今度はコピー元のプロパティは上書きされておらず、構造体が値型であることが分かる。
また、StringやArrayなどの基本的なデータ型も構造体として実装されており、これらも値型となっている。