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 和调用者承诺的合同.