Swift 1.2扩展

时间:2015-04-16 22:30:02

标签: swift xcode6.3 swift-extensions

我将XCode升级到6.3 / Swift 1.2并且我看到了扩展错误。下面是我对UINavigationItem的扩展,用于隐藏backButton文本。

extension UINavigationItem {
    func backBarButtonItem() -> UIBarButtonItem {
        return UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
    }
}

编译时,我收到以下错误

方法" backBarButtonItem()"使用Objective-C选择器" backBarButtonItem"与" backBarButtonItem"

的getter冲突

是否无法再使用扩展名覆盖方法?

2 个答案:

答案 0 :(得分:2)

问题是你没有覆盖一个属性,但是试图提供在同一个类中定义的属性(getter of)的不同实现

首先要说的是6.3中有些变化(见release notes (18391046, 18383574)

  

Swift现在检测Swift类型系统中的重载和覆盖之间的差异以及通过Objective-C运行时看到的有效行为。

也就是说,您正在扩展中创建一个新的backBarButtonItem方法。但是UINavigationItem已经有backBarButtonItem属性,并且会自动为其创建getter和setter backBarButtonItemsetBackBarButtonItem。另请注意,backBarButtonItem属性是在UINavigationItem类中定义的,并不是从超类继承的,因此在这种情况下,它不会覆盖。

可以认为将方法转换为计算属性可以解决问题。但它没有,出于同样的原因:backBarButtonItem属性不是继承的,它是在同一个类中定义的。

很明显,现在Xcode 6.3修复了这个差异,你想做什么是不可能的。

要证明,如果您尝试将该扩展程序添加到从UINavigationItem继承的类中,则可以正常运行:

class MyNavigationItem : UINavigationItem {
}

extension MyNavigationItem {
    override var backBarButtonItem: UIBarButtonItem? {
        get {
            return UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        }
        set {
            super.backBarButtonItem = newValue
        }
    }
}

要注意您不能再创建方法,因为它会覆盖属性getter(现在不允许)。您必须覆盖整个属性,使其成为计算属性。

答案 1 :(得分:0)

从错误消息看,backBarButtonItemUINavigationItem的属性,而不是方法。事实上,我刚刚证实了这一点。

var backBarButtonItem: UIBarButtonItem?

因此,您通过在扩展程序中将其声明为方法来尝试覆盖属性。据我所知,您只能将计算属性(实例或类型)添加到扩展程序,因此尝试覆盖扩展程序中的backBarButtonItem将无效。