据我所知,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。我们在我们的应用程序中定义子类。问题是:我们如何在不了解属性性质的情况下依赖子类观察者:它是存储的(我们可以依赖观察者)还是计算的(然后我们不能期望每次都在我们期望的时候触发观察者)?可能吗?如果不是,是否违反封装?