2015-04-13 9 views
9

W Swift 1.1 udało nam się skompilować kod jak poniżej i pracować tam, gdzie odsłoniliśmy istniejące właściwości Objective-C poprzez protokół dodany przez rozszerzenie. Mieliśmy też kilka, w których nieruchomość jest obsługiwana przez rozszerzenie.Jak odsłonić istniejącą właściwość w klasie Obj-C za pomocą protokołu rozszerzenia w Swift

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

Kiedy próbuje skompilować ten kod przy użyciu XCode 6.3, Swift 1.2, otrzymujemy następujący błąd Type 'UIButton' does not conform to the protocol 'Enableable'. Rozszerzenie UIImageView wydaje się kompilować dobrze.

Czy istnieje sposób na ujawnienie tego rodzaju istniejących właściwości z typu Objective-C lub czy musimy zaimplementować właściwość proxy o innej nazwie?

Odpowiedz

8

Kompilator komunikat o błędzie

 
note: Objective-C method 'isEnabled' provided by getter for 'enabled' does not match the requirement's selector ('enabled') 

daje wskazówkę o problemie. Właściwość UIButtonenabled jest dziedziczony UIControl w celu C zadeklarowane jako

@property(nonatomic, getter=isEnabled) BOOL enabled 

Dlatego sposób protokół musi być

@objc protocol Enableable: class { 
    var enabled: Bool { @objc(isEnabled) get set } 
} 

i realizacji (podobnie jak w 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 
     } 
    } 
} 
+1

Dzięki za odpowiedź. Zastanawiałem się, czy to z powodu podpisu, ale nie wiedziałem, co z tym zrobić. Nigdy nie widzieliśmy opcji protokołu @ objc Enableable: class { var enabled: Bool {@objc (isEnabled) get set} } ' –

Powiązane problemy