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