如何使用 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')

给出了有关问题的提示。 UIButtonenabled属性继承自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
        }
    }
}