在重写的存储属性上,带有getter / setter的变量不能具有初始值

时间:2016-08-10 15:09:43

标签: swift

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

  

使用getter / setter的变量不能具有初始值。

这看起来很奇怪,因为这不是带有getter / setter的计算属性,而是存储属性上的一组Observing Accessors!

class FirstViewController: UIViewController {

internal var test: Float = 32.0 {
    willSet {

    }

    didSet {

    }
}

第一个视图控制器编译正常,存储属性初始化为32.0

class SecondViewController: FirstViewController {

override var test: Float = 64.0 {
    willSet {

    }

    didSet {

    }
}

第二个视图控制器不编译,因为'计算属性'被赋予初始值

2 个答案:

答案 0 :(得分:5)

在swift中,您只能使用相同类型的计算属性(无法使用默认值)覆盖属性。在您的情况下,如果您希望在test中覆盖SecondViewController属性,则需要编写如下内容:

override var test: Float {
    get {
        return super.test
    }
    set {
        super.test = newValue
    }
}

并且无法直接覆盖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) {}

SecondViewController:

override func test_WillSet(newValue: Float) {
    super.test_WillSet(newValue)
}
override func test_DidSet(oldValue: Float) {
    super.test_DidSet(oldValue)
}

答案 1 :(得分:0)

我知道很久以前就已经问过这个问题,但我想出了一个略有不同的解决方案,它的工作原理完全符合您的要求。在第一个ViewController中具有一个属性,然后在继承的ViewController中覆盖它,并以didSet的形式在其上设置观察者。

因此,在FirstViewController中,您具有以下示例中的属性:

var myNumber: Double = 20.00

然后在从FirstViewController继承的SecondViewController中,按如下所示重写它:

override var myNumber: Double {
     didSet {
             //Here you can update UI or whatever you want to do once the property changes
             //Print its value
             print("Value of myNumber is : \(myNumber)")
            }

我希望这对解决上述问题的人有所帮助,因为这是解决上述问题的简便方法。