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