【问题标题】:How can I override this Swift property?如何覆盖这个 Swift 属性?
【发布时间】:2016-05-24 05:50:34
【问题描述】:
class Base: UIViewController {
    var rightButtonColor: UIColor = UIColor.blueColor()
}


class SecondViewController: Base {    
    override var rightButtonColor: UIColor {
        return UIColor.redColor() 
    }
}

我收到一个错误:

使用 Objective-C 选择器的“rightButtonColor”获取器 'rightButtonColor' 与来自的 'rightButtonColor' 的 getter 冲突 具有相同 Objective-C 的超类“Base” 选择器

【问题讨论】:

  • 您根本无法用只读属性覆盖读写属性。 OOP 的一个关键规则是您始终可以将子类传递给任何期望其超类的东西。对于期望超类的东西,您的属性是可读写的——但如果您传入子类,则不是。请注意,如果您反转此示例(尝试使用读写属性覆盖只读属性),它会起作用(尽管您的读写属性必须是计算出来的,因为您不能在覆盖)。

标签: ios swift


【解决方案1】:

试试这样:

class Base: UIViewController {
    var rightButtonColor: UIColor {
        return UIColor.blueColor()
    }
}

class SecondViewController: Base {
    override var rightButtonColor: UIColor {
        return UIColor.redColor()
    }
}

【讨论】:

    【解决方案2】:

    rightButtonColor 的两个不同声明具有不同的类型。如果您确保它们是完全相同的类型,它可以干净地编译:

    class Base: UIViewController {
        var rightButtonColor: UIColor {
            return UIColor.blueColor()
        }
    }
    
    class SecondViewController: Base {
        override var rightButtonColor: UIColor {
            return UIColor.redColor()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 2015-02-20
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2011-11-06
      • 2015-01-08
      • 2013-12-16
      相关资源
      最近更新 更多