我目前正在玩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 {
}
}
}
为什么我无法在第一个代码片段中添加属性观察者,但我能够在子类中覆盖这些观察者?
答案 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