Mic*_*ubs 10 protocols objective-c ios 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
当尝试使用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')
提供有关问题的提示.该enabled属性UIButton继承自UIControlObjective-C并声明为
@property(nonatomic, getter=isEnabled) BOOL enabled
Run Code Online (Sandbox Code Playgroud)
因此协议方法必须如此
@objc protocol Enableable: class {
var enabled: Bool { @objc(isEnabled) get set }
}
Run Code Online (Sandbox Code Playgroud)
和实现(类似于使用getter的Objective-C协议的Swift 1.2错误):
extension UIImageView: Enableable {
var enabled: Bool {
@objc(isEnabled) get {
return alpha > DisabledAlpha
}
set(enabled) {
alpha = enabled ? EnabledAlpha : DisabledAlpha
}
}
}
Run Code Online (Sandbox Code Playgroud)