[英]Swift: property observers for computed properties
据我所知,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观察者:它是存储的(并且我们可以依赖观察者)还是经过计算的(然后我们不能期望每次期望时都会触发观察者)? 可能吗? 如果否,是否违反封装规定?
这种行为是完全正常的。 编译器无法知道哪个后备存储真正对应于哪个计算属性。 在这种情况下,您的后备存储由私有变量组成,这些私有变量将在类本身之外无法访问。 因此,可以在底层进行更改的唯一位置是基类。 使用该类的计算属性(将触发观察者)或使用后备存储(不会)将是该类的特权。
在您的示例中,假设您永远不希望允许“不可见的”更改,那么changeSomeValues()函数将违反其自身的规则,并且不会遵守它对子类和调用者所承诺的约定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.