Swift:计算属性的属性观察者

时间:2016-01-16 18:15:42

标签: ios swift 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时,不会调用

didSet of SubClass。

让我们考虑一个案例:我们在第三方框架中有这样的BaseClass。我们在我们的应用程序中定义SubClass。问题是:我们如何在不了解属性的情况下依赖SubClass观察者:它是存储的(我们可以依赖于观察者)还是计算出来的(然后我们不能指望每当我们期望它时都会发射观察者)?可能吗?如果不是,是否违反了包装?

1 个答案:

答案 0 :(得分:0)

这种行为完全正常。编译器无法知道哪个后备存储真正对应于哪个计算属性。在这种情况下,您的后备存储由私有变量组成,这些变量在类本身之外是不可访问的。因此,#"引擎盖下的唯一地方是#34;可以在基类中发生更改。使用其计算属性(将触发观察者)或后台(不会)的类是特权。

在你的例子中,假设你永远不想允许"隐形"更改时,changeSomeValues()函数违反了自己的规则,并且不遵守它承诺给其子类和调用者的合同。