繁体   English   中英

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。 问题是:在不了解属性性质的情况下,我们如何能够依赖SubClass观察者:它是存储的(并且我们可以依赖观察者)还是经过计算的(然后我们不能期望每次期望时都会触发观察者)? 可能吗? 如果否,是否违反封装规定?

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

在您的示例中,假设您永远不希望允许“不可见的”更改,那么changeSomeValues()函数将违反其自身的规则,并且不会遵守它对子类和调用者所承诺的约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM