据我所知,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时,不会调用didSet of SubClass。
让我们考虑一个案例:我们在第三方框架中有这样的BaseClass。我们在我们的应用程序中定义SubClass。问题是:我们如何在不了解属性的情况下依赖SubClass观察者:它是存储的(我们可以依赖于观察者)还是计算出来的(然后我们不能指望每当我们期望它时都会发射观察者)?可能吗?如果不是,是否违反了包装?
答案 0 :(得分:0)
这种行为完全正常。编译器无法知道哪个后备存储真正对应于哪个计算属性。在这种情况下,您的后备存储由私有变量组成,这些变量在类本身之外是不可访问的。因此,#"引擎盖下的唯一地方是#34;可以在基类中发生更改。使用其计算属性(将触发观察者)或后台(不会)的类是特权。
在你的例子中,假设你永远不想允许"隐形"更改时,changeSomeValues()函数违反了自己的规则,并且不遵守它承诺给其子类和调用者的合同。