2015-04-13 4 views
9

In Swift 1.1 siamo stati in grado di avere codice come sotto compilato e lavorare dove abbiamo esposto le proprietà Objective-C esistenti attraverso un protocollo aggiunto da un'estensione. Ne abbiamo anche alcuni in cui la proprietà viene gestita dall'estensione.Come esporre la proprietà esistente sulla classe Obj-C usando un protocollo di estensione in 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 
     } 
    } 
} 

Quando si cerca di compilare il codice utilizzando XCode 6.3 e Swift 1.2, otteniamo l'errore Type 'UIButton' does not conform to the protocol 'Enableable' seguente. L'estensione UIImageView sembra compilare bene.

Esiste un modo per esporre questo tipo di proprietà esistenti da un tipo Objective-C o dobbiamo implementare una proprietà proxy con un nome diverso?

risposta

8

Il compilatore messaggio di errore

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

dà un suggerimento in merito al problema. La enabled proprietà di UIButton è ereditato da UIControl e in Objective-C dichiarati

@property(nonatomic, getter=isEnabled) BOOL enabled 

Pertanto il metodo di protocollo deve essere

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

e l'attuazione (similmente come 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 
     } 
    } 
} 
+1

Grazie per la risposta. Mi chiedevo se fosse dovuto alla firma ma non ero sicuro di cosa fare al riguardo. Non abbiamo mai visto il protocollo '@ objc Enableable: classe { var abilitato: Bool {@objc (isEnabled) get set} }' –