Swift:属性 个计算属性观察者
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 观察者:它是存储的(我们可以依赖观察者)还是计算的(然后我们不能期望每次都触发观察者)?可能吗?如果不是,是否违反了封装?
这种行为是完全正常的。编译器无法知道哪个后备存储真正对应于哪个计算 属性。在这种情况下,您的后备存储由无法在 class 本身之外访问的私有变量组成。因此,唯一可以发生 "under the hood" 更改的地方是在基础 class 中。 class 有权使用其计算属性(这将触发观察者)或后台存储(不会触发)。
在您的示例中,假设您永远不想允许 "invisible" 更改,则 changeSomeValues() 函数违反了它自己的规则并且不遵守它向其子classes 和调用者承诺的合同.
据我所知,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 观察者:它是存储的(我们可以依赖观察者)还是计算的(然后我们不能期望每次都触发观察者)?可能吗?如果不是,是否违反了封装?
这种行为是完全正常的。编译器无法知道哪个后备存储真正对应于哪个计算 属性。在这种情况下,您的后备存储由无法在 class 本身之外访问的私有变量组成。因此,唯一可以发生 "under the hood" 更改的地方是在基础 class 中。 class 有权使用其计算属性(这将触发观察者)或后台存储(不会触发)。
在您的示例中,假设您永远不想允许 "invisible" 更改,则 changeSomeValues() 函数违反了它自己的规则并且不遵守它向其子classes 和调用者承诺的合同.