Swiftの構造体は、クラスと非常に似ているが、オブジェクトをコピーした時の挙動に大きな違いがある。
構造体は値型でクラスは参照型
構造体の場合、変数Aに入った構造体を変数Bに代入すると、変数Aのコピーが生成され新たな構造体として代入される。
一方クラスの場合、同じように変数Aのクラスを変数Bに代入した時、複製されず変数Aの参照が代入される。
では例を見ていこう。
まずはクラスの場合。
01 02 03 04 05 06 07 08 09 10 11 | 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に書き換わっておりクラスが参照型であることが分かる。
次に構造体の例を見てみよう。
01 02 03 04 05 06 07 08 09 10 11 | 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などの基本的なデータ型も構造体として実装されており、これらも値型となっている。