/ / So stellen Sie eine vorhandene Eigenschaft in der Obj-C-Klasse mithilfe eines Erweiterungsprotokolls in den Protokollen i8, object-c, swift zur Verfügung

Wie man vorhandene Eigenschaften auf der Obj-C-Klasse unter Verwendung eines Erweiterungsprotokolls in Swift-ios, Ziel-c, Swift-Protokollen, verfügbar macht

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 № 1

Die 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
}
}
}