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

时间:2015-04-13 05:56:49

标签: ios objective-c swift protocols

在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类型公开这些类型的现有属性,还是我们必须使用不同的名称实现代理属性?

1 个答案:

答案 0 :(得分:9)

编译器错误消息

note: Objective-C method 'isEnabled' provided by getter for 'enabled' does not match the requirement's selector ('enabled')

提供有关问题的提示。 enabled的{​​{1}}属性继承自UIButton,并且在Objective-C中继承为

UIControl

因此协议方法必须

@property(nonatomic, getter=isEnabled) BOOL enabled

和实施(类似于Swift 1.2 error on Objective-C protocol using getter):

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