如何在Swift中使用扩展协议公开obj-C类的现有属性

在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-Ctypes公开这些现有的属性,或者我们必须实现一个不同名称的代理属性?

编译器错误信息

注意:getter为'enabled'提供的Objective-C方法'isEnabled'与需求的select器('enabled')不匹配

给出了一个关于这个问题的暗示。 UIButtonenabled属性从UIControlinheritance,在Objective-C中声明为

 @property(nonatomic, getter=isEnabled) BOOL enabled 

因此协议方法必须是

 @objc protocol Enableable: class { var enabled: Bool { @objc(isEnabled) get set } } 

和实现(类似于使用getter的Objective-C协议中的Swift 1.2错误 ):

 extension UIImageView: Enableable { var enabled: Bool { @objc(isEnabled) get { return alpha > DisabledAlpha } set(enabled) { alpha = enabled ? EnabledAlpha : DisabledAlpha } } }