问题
In Swift 1.1 we were able to have code like below compile and work where we exposed existing Objective-C properties through a protocol added by an extension. We also had a few where the property is handled by the extension.
@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
}
}
}
When trying to compile this code using XCode 6.3 and Swift 1.2, we get the following error Type 'UIButton' does not conform to the protocol 'Enableable'. The UIImageView extension seems to compile fine.
Is there any way to expose these sort of existing properties from an Objective-C type or do we have to implement a proxying property with a different name?
回答1:
The compiler error message
note: Objective-C method 'isEnabled' provided by getter for 'enabled' does not match the requirement's selector ('enabled')
gives a hint about the problem. The enabled property of UIButton is inherited from UIControl and in Objective-C declared as
@property(nonatomic, getter=isEnabled) BOOL enabled
Therefore the protocol method has to be
@objc protocol Enableable: class {
var enabled: Bool { @objc(isEnabled) get set }
}
and the implementation (similarly as in Swift 1.2 error on Objective-C protocol using getter):
extension UIImageView: Enableable {
var enabled: Bool {
@objc(isEnabled) get {
return alpha > DisabledAlpha
}
set(enabled) {
alpha = enabled ? EnabledAlpha : DisabledAlpha
}
}
}
来源:https://stackoverflow.com/questions/29598680/how-to-expose-existing-property-on-obj-c-class-using-an-extension-protocol-in-sw