具有getter / setter的变量在覆盖的存储属性上不能具有初始值

J_l*_*ama 6 swift

使用观察访问器创建存储属性时,可以指定默认值。但是,当覆盖存储的属性及其访问器时,我无法指定默认值。

使用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)

第二个视图控制器无法编译,因为“计算属性”被赋予了初始值

Sha*_* Of 6

快速地,您只能使用相同类型的计算属性(不能具有默认值)覆盖属性。在您的情况下,如果您希望覆盖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)