如何覆盖这个 Swift 属性?

Posted

技术标签:

【中文标题】如何覆盖这个 Swift 属性?【英文标题】:How can I override this Swift property? 【发布时间】: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 的一个关键规则是您始终可以将子类传递给任何期望其超类的东西。对于期望超类的东西,您的属性是可读写的——但如果您传入子类,则不是。请注意,如果您反转此示例(尝试使用读写属性覆盖只读属性),它会起作用(尽管您的读写属性必须是计算出来的,因为您不能在覆盖)。 【参考方案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()
    

【讨论】:

以上是关于如何覆盖这个 Swift 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中覆盖 Objective-C 的只读属性?

如何在 Swift 中覆盖协议扩展的计算属性

覆盖 Swift 中的存储属性

在 Swift 中覆盖具有不同类型的超类属性

快速覆盖实例属性(帮助)

iOS Swift4如何保护接口中定义的计算属性不被赋值?