为什么不能为计算属性定义属性观察者?

时间:2016-02-22 15:36:50

标签: swift

我目前正在玩swift,有一件事我不明白。

让我们看看以下 非编译代码段

class A {
    var test : String  {
        get {
            return "foo"
        }

        set {
            self.test = newValue
        }

        willSet {

        }

        didSet {

        }
    }
}

由于某种原因编译器抱怨。所以我无法实现所有这些:get和set,didSet和willSet。我认为观察计算属性可能是不可能的。

所以我玩了一点,然后我发现子类可以覆盖计算属性的属性观察者。 什么情况? 这对我来说没什么意义

import UIKit

class A {
    var test : String  {
        get {
            return "name"
        }

        set {
            self.test = newValue
        }
    }
}

class B : A {
    override var test : String {
        willSet {

        }

        didSet {

        }
    }
}

为什么我无法在第一个代码片段中添加属性观察者,但我能够在子类中覆盖这些观察者?

2 个答案:

答案 0 :(得分:3)

在第一个代码中,您不需要需要观察者,因为您已经在编写设置属性的代码(set)。因此,如果您想在设置属性之前/之后执行某些操作,您可以在setter处理程序(set)中执行此操作:

class A {
    var test : String  {
        get {
            return "foo"
        }
        set {
            // will set
            self.test = newValue
            // did set
        }
    }
}

因此,通过一种Occam的Razor原则,拥有单独的setter观察者是多余的,没有必要:你的setter,所以没有必要自己观察。

另一方面,在你的子类覆盖中,你没有提供一个全新的计算属性,设置是在你的背后进行,所以作为补偿,你可以将set观察注入到过程

答案 1 :(得分:1)

  

“您不需要为非重写的计算属性定义属性观察器,因为您可以在计算属性的setter中观察并响应其值的更改。”

摘录自:Apple Inc.“The Swift Programming Language(Swift 2.1)。”iBooks。 https://itunes.apple.com/cn/book/swift-programming-language/id881256329?l=en&mt=11