我将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冲突是否无法再使用扩展名覆盖方法?
答案 0 :(得分:2)
问题是你没有覆盖一个属性,但是试图提供在同一个类中定义的属性(getter of)的不同实现。
首先要说的是6.3中有些变化(见release notes (18391046, 18383574):
)Swift现在检测Swift类型系统中的重载和覆盖之间的差异以及通过Objective-C运行时看到的有效行为。
也就是说,您正在扩展中创建一个新的backBarButtonItem
方法。但是UINavigationItem
已经有backBarButtonItem
属性,并且会自动为其创建getter和setter backBarButtonItem
和setBackBarButtonItem
。另请注意,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)
从错误消息看,backBarButtonItem
是UINavigationItem
的属性,而不是方法。事实上,我刚刚证实了这一点。
var backBarButtonItem: UIBarButtonItem?
因此,您通过在扩展程序中将其声明为方法来尝试覆盖属性。据我所知,您只能将计算属性(实例或类型)添加到扩展程序,因此尝试覆盖扩展程序中的backBarButtonItem
将无效。