如何使用 Swift 中的扩展协议在 Obj-C class 上公开现有 属性
How to expose existing property on Obj-C class using an extension protocol in Swift
在 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 类型公开这些现有属性,或者我们是否必须使用不同的名称实现代理 属性?
编译器错误信息
note: Objective-C method 'isEnabled' provided by getter for 'enabled' does not match the requirement's selector ('enabled')
给出了有关问题的提示。 UIButton
的enabled
属性继承自UIControl
,在Objective-C中声明为
@property(nonatomic, getter=isEnabled) BOOL enabled
因此协议方法必须是
@objc protocol Enableable: class {
var enabled: Bool { @objc(isEnabled) get set }
}
和实现(类似于
extension UIImageView: Enableable {
var enabled: Bool {
@objc(isEnabled) get {
return alpha > DisabledAlpha
}
set(enabled) {
alpha = enabled ? EnabledAlpha : DisabledAlpha
}
}
}