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などの基本的なデータ型も構造体として実装されており、これらも値型となっている。