在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扩展似乎可以正常编译。
Type 'UIButton' does not conform to the protocol 'Enableable'
是否有任何方法可以从Objective-C类型公开这些现有属性,还是必须使用其他名称来实现代理属性?
编译器错误信息
注意:getter为“启用”提供的Objective-C方法“ isEnabled”与需求的选择器(“启用”)不匹配
提供有关该问题的提示。的enabled属性UIButton是从UIControlObjective-C 继承并声明为
enabled
UIButton
UIControl
@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 } } }