在Swift 1.1中,我们能够使用下面的代码编译和工作,我们通过扩展添加的协议公开现有的Objective-C属性。我们还有一些扩展处理财产的地方。
@objc protocol Enableable: class {
var enabled: Bool { get set }
}
let DisabledAlpha: CGFloat = 0.5
let EnabledAlpha: CGFloat = 1.0
extension UIButton: Enableable {}
extension UIImageView: Enableable {
var enabled: Bool {
get {
return alpha > DisabledAlpha
}
set(enabled) {
alpha = enabled ? EnabledAlpha : DisabledAlpha
}
}
}
当尝试使用XCode 6.3和Swift 1.2编译此代码时,我们收到以下错误Type 'UIButton' does not conform to the protocol 'Enableable'
。 UIImageView扩展似乎编译得很好。
有没有办法从Objective-C类型公开这些类型的现有属性,还是我们必须使用不同的名称实现代理属性?
答案 0 :(得分:9)
编译器错误消息
note: Objective-C method 'isEnabled' provided by getter for 'enabled' does not match the requirement's selector ('enabled')
提供有关问题的提示。 enabled
的{{1}}属性继承自UIButton
,并且在Objective-C中继承为
UIControl
因此协议方法必须
@property(nonatomic, getter=isEnabled) BOOL enabled
和实施(类似于Swift 1.2 error on Objective-C protocol using getter):
@objc protocol Enableable: class {
var enabled: Bool { @objc(isEnabled) get set }
}