値型と参照型について、モヤモヤっとしていたので調べた時の覚書
Classは参照型
参照型は変数にインスタンスの値のメモリ保管場所を収納する。
なので、インスタンスが入った変数vを他の変数zに代入するとzにもインスタンスの値のメモリアドレスが格納される。つまりvとzは同じインスタンスのメモリアドレスを見てるので、どちらかが変更された場合はその片方の値も変更(されたように見える。vの値が変更されたわけではなく、vの参照しているメモリアドレスに格納されている値が変更されている)される。また、let表記でもプロパティの変更はできる(変数のメモリには参照先のアドレスがあるのみで、そのアドレスを変更しているわけではないから)
class A {
var test:Int = 0
}
let v = A()
v.test = 1
let z = v
z.test = 2 // letだけど変更できる
z = A() // NG!
print(v.test) // 2
print(z.test) // 2
StructやEnumは値型
値型は変数に値そのものを収納する。
なので、変数vとzが見ている先は別のものなので両者はそれぞれ独立している
なので、プロパティを変更するときは、let表記だと変更できない(変数のメモリに値があり、その値を変更しようとしているため)
class A {
var test:Int = 0
}
let v = A()
v.test = 1
let z = v
z.test = 2
print(v.test) // 1 変更されていない
print(z.test) // 2