如何在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')不匹配
给出了一个关于这个问题的暗示。 UIButton
的enabled
属性从UIControl
inheritance,在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 } } }