Swiftにはprivate(set)という修飾子があります。
これは外部からの代入を防ぐ修飾子です。
class MyClass {
private(set) var value = 0
func setValue(value: Int) {
self.value = value // エラーにならない
}
}
MyClass().value = 1 // エラーになる
private(set)は代入だけでなくArrayのappendメソッド等にも有効です。
class MyClass {
private(set) var value = [Int]()
}
MyClass().value.append(1) // エラーになる
なぜappendメソッドも呼べなくなるか
appendがmutatingなメソッドだからです。
mutatingなメソッドは内部で自身の再代入を行っています。
再代入するのでsetの一種と見なされてエラーになったのだと思われます。
// 多分下のような実装
mutating func append(element: Generator.Element) {
self = self + [element]
}
実際にメモリ番地を調べた所、append前と後で変更されていました。
var arr = [Int]()
print(unsafeAddressOf(arr)) // 0x00007fa002611f40
arr.append(1)
print(unsafeAddressOf(arr)) // 0x00007fa00268cac0
didSetとArrayのappendメソッド
private(set)の話と同様で、Arrayのappendメソッドを呼んだ時にdidSetも走ります。
class MyClass {
var value = [Int]() {
didSet {
print("didSet")
}
}
}
MyClass().value.append(1)