Swift

2015-04-13 27 views
9

'da bir uzantı protokolü kullanarak Obj-C sınıfındaki var olan varlık nasıl ortaya çıkarılır? Swift 1.1'de, derleme gibi bir kodumuz vardı ve mevcut Objective-C özelliklerini bir uzantı tarafından eklenen bir protokol aracılığıyla açığa vurduğumuz yerde çalıştırabiliyorduk. Ayrıca, mülkiyetin uzantı tarafından ele alındığı birkaç yerimiz vardı. 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 
     } 
    } 
} 

, yanlışlıkla Type 'UIButton' does not conform to the protocol 'Enableable' aşağıdaki olsun XCode 6.3 ve Swift 1.2 kullanarak bu kodu derlemek çalışırken. UIImageView uzantısı iyi derlenmiş gibi görünüyor.

Bu tür varolan özellikleri Objective-C türünden göstermenin bir yolu var mı, yoksa farklı bir isimle bir proxy oluşturma özelliğini mi uygulamak zorundayız?

cevap

8

derleyici hata mesajı

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

sorun hakkında bir ipucu verir.

: UIButton arasında enabled özelliği UIControl gelen ve amaç-C devralınır

@property(nonatomic, getter=isEnabled) BOOL enabled 

nedenle protokol yöntemi

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

ve (benzer Swift 1.2 error on Objective-C protocol using getter gibi) uygulanması için olan ilan

extension UIImageView: Enableable { 
    var enabled: Bool { 
     @objc(isEnabled) get { 
      return alpha > DisabledAlpha 
     } 
     set(enabled) { 
      alpha = enabled ? EnabledAlpha : DisabledAlpha 
     } 
    } 
} 
+1

Yanıt için teşekkürler. İmzadan kaynaklanıp kaynaklanmadığını merak ediyordum ama bu konuda ne yapılacağından emin değildim. Hiç görmedik '@ objc protokolü Etkinleştirilebilir: class { var etkin: Bool {@objc (isEnabled) ayarlandı} } ' –