私の知る限り、Swift では、格納されたプロパティと計算されたプロパティのいずれかにプロパティ オブザーバーを設定できます。ただし、計算されたプロパティ値が一部のバッキング ストアに依存している場合、これらのバッキング ストア値が変更されたときにプロパティ オブザーバーは起動されません。
public class BaseClass {
private var privateVar1: Int = 0
private var privateVar2: Int = 0
public var property: Int {
get {
return privateVar1 * privateVar2
}
set {
print("some setter without effect")
}
}
private func changeSomeValues() {
privateVar1 = 1
privateVar2 = 2
}
}
public class SubClass : BaseClass {
override var property: Int {
didSet {
print("didSet \(property)")
}
}
}
changeSomeValues が呼び出されたときに SubClass の didSet が呼び出されません。
ケースを考えてみましょう: サードパーティ フレームワークにそのような BaseClass があります。アプリで SubClass を定義します。問題は、プロパティの性質についての知識なしに SubClass オブザーバーにどのように依存できるかです: それは保存されている (そしてオブザーバーに依存できる) のか、それとも計算されているのか (そして、期待するたびにオブザーバーを起動することは期待できません) ? 出来ますか?いいえの場合、カプセル化違反ですか?