【问题标题】:Variable with getter/setter cannot have initial value, on overridden stored property具有 getter/setter 的变量在被覆盖的存储属性上不能具有初始值
【发布时间】:2016-08-10 15:09:42
【问题描述】:

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

带有getter/setter的变量不能有初始值。

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

class FirstViewController: UIViewController {

internal var test: Float = 32.0 {
    willSet {

    }

    didSet {

    }
}

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

class SecondViewController: FirstViewController {

override var test: Float = 64.0 {
    willSet {

    }

    didSet {

    }
}

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

【问题讨论】:

    标签: swift


    【解决方案1】:

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

    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)
    }
    

    【讨论】:

      【解决方案2】:

      我知道很久以前就有人问过这个问题,但我想出了一个稍微不同的解决方案,它完全符合您的要求。您在第一个 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)")
                  }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 2018-11-08
        • 1970-01-01
        • 2023-03-13
        • 2018-05-15
        • 1970-01-01
        • 2017-06-27
        相关资源
        最近更新 更多