使用观察访问器创建存储属性时,可以指定默认值。但是,当覆盖存储的属性及其访问器时,我无法指定默认值。
使用getter / setter的变量不能具有初始值。
这似乎很奇怪,因为这不是带有getter / setter的计算属性,而是存储属性上的一组Observing Accessors!
class FirstViewController: UIViewController {
internal var test: Float = 32.0 {
willSet {
}
didSet {
}
}
Run Code Online (Sandbox Code Playgroud)
第一个视图控制器可以正常编译,并将存储的属性初始化为32.0
class SecondViewController: FirstViewController {
override var test: Float = 64.0 {
willSet {
}
didSet {
}
}
Run Code Online (Sandbox Code Playgroud)
第二个视图控制器无法编译,因为“计算属性”被赋予了初始值
快速地,您只能使用相同类型的计算属性(不能具有默认值)覆盖属性。在您的情况下,如果您希望覆盖test属性,则SecondViewController需要编写如下内容:
override var test: Float {
get {
return super.test
}
set {
super.test = newValue
}
}
Run Code Online (Sandbox Code Playgroud)
而且没有办法直接覆盖didSet/ willSet观察者;您可以通过编写其他在观察者中调用的方法来做到这一点,并覆盖它们:
FirstViewController:
internal var test: Float = 32.0 {
willSet {
test_WillSet(newValue)
}
didSet {
test_DidSet(oldValue)
}
}
func test_WillSet(newValue: Float) {}
func test_DidSet(oldValue: Float) {}
Run Code Online (Sandbox Code Playgroud)
SecondViewController:
override func test_WillSet(newValue: Float) {
super.test_WillSet(newValue)
}
override func test_DidSet(oldValue: Float) {
super.test_DidSet(oldValue)
}
Run Code Online (Sandbox Code Playgroud)