In Swift 1.1 Wir konnten Code wie unten kompilieren und dort arbeiten, wo wir die vorhandenen Objective-C-Eigenschaften über ein durch eine Erweiterung hinzugefügtes Protokoll verfügbar gemacht haben. Wir hatten auch einige, bei denen die Immobilie von der Erweiterung bearbeitet wird.
@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
}
}
}
Wenn Sie versuchen, diesen Code mit XCode 6.3 und Swift 1.2 zu kompilieren, wird der folgende Fehler angezeigt Type "UIButton" does not conform to the protocol "Enableable"
. Die UIImageView-Erweiterung scheint gut zu kompilieren.
Gibt es eine Möglichkeit, diese Art vorhandener Eigenschaften eines Objective-C-Typs verfügbar zu machen, oder müssen wir eine Proxy-Eigenschaft mit einem anderen Namen implementieren?
Antworten:
9 für die Antwort № 1Die Compiler-Fehlermeldung
note: Die Objective-C-Methode "isEnabled", die von getter für "enabled" bereitgestellt wird, stimmt nicht mit dem Selektor der Anforderung überein ("enabled")
gibt einen Hinweis auf das Problem. Das enabled
Eigentum von UIButton
wird von geerbt UIControl
und in Objective-C als deklariert
@property(nonatomic, getter=isEnabled) BOOL enabled
Daher muss die Protokollmethode sein
@objc protocol Enableable: class {
var enabled: Bool { @objc(isEnabled) get set }
}
und die Implementierung (ähnlich wie in Swift 1.2-Fehler beim Objective-C-Protokoll mit Getter):
extension UIImageView: Enableable {
var enabled: Bool {
@objc(isEnabled) get {
return alpha > DisabledAlpha
}
set(enabled) {
alpha = enabled ? EnabledAlpha : DisabledAlpha
}
}
}