小编典典

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

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类型公开这些现有属性,还是必须使用其他名称来实现代理属性?


阅读 320

收藏
2020-07-07

共1个答案

小编典典

编译器错误信息

注意:getter为“启用”提供的Objective-C方法“ isEnabled”与需求的选择器(“启用”)不匹配

提供有关该问题的提示。的enabled属性UIButton是从UIControlObjective-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
        }
    }
}
2020-07-07