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?
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
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.