2016-03-22 23 views
2

Swift 2 ile basit bir gözlemci karışımı oluşturmaya çalışıyorum. İşte sadece alakalı Bölüm. Binary operator '===' cannot be applied to operands of type '_' and 'Self.T'Protokolde hızlı jenerikler: '===', '_' ve 'Self.T' türündeki işlenenler için uygulanamaz.

sen bana açıklayabilir neden bu hata oluştuğu:

extension Observable{ 

    mutating func removeObserver(observer:T){ 
     let index = self.observers.indexOf{ $0 === observer } 
     if let _ = index{ 
      self.observers.removeAtIndex(index) 
     } 
    } 
} 

Bu derleyici hata oluşturur:

protocol Observable{ 

    typealias T 
    var observers:[T] { get set } 
    mutating func removeObserver(observer:T) 
} 

Ek süreye kullanmak mixin oluşturmak için?

cevap

2

"özdeş" e-operatör === sadece referans uygulanabilir tipleri, class yani örnekleri. genel tür kısıtlamak olası bir çözümdür TAnyObject (bütün sınıflar üstü kapalı uymak hangi protokol) için: Alternatif

protocol Observable { 

    typealias T : AnyObject 
    var observers:[T] { get set } 
    mutating func removeObserver(observer:T) 
} 

extension Observable { 

    mutating func removeObserver(observer:T) { 
     if let index = (self.observers.indexOf { $0 === observer }) { 
      self.observers.removeAtIndex(index) 
     } 
    } 
} 

, bir == operatör tanımlanmalıdır anlamına gelir (T için Equatable türlerini kısıtlamak tür): Yanıt (

).
protocol Observable { 

    typealias T : Equatable 
    var observers:[T] { get set } 
    mutating func removeObserver(observer:T) 
} 

extension Observable { 

    mutating func removeObserver(observer:T) { 
     if let index = self.observers.indexOf(observer) { 
      self.observers.removeAtIndex(index) 
     } 
    } 
} 
+0

Cevabınız için teşekkürler. Bunu kabul ettim, çünkü açıkçası benim soruma cevap oldu :) Ne yazık ki, sorunumu tamamen çözmüyor. Diyelim ki, "AnyObject" uygulayan bir "protokol" gözlemcisi tanımladım. Sonra 'Gözlenebilir' uygulayan bir 'ConcreteObservable 'sınıfı yaratıyorum. Ben typealias T = Observer'ı tanımlarım. Aşağıdaki hatayı alıyorum: 'Tür 'ConcreteObservable', 'Gözlemlenebilir' protokolüne uymuyor '' Gözlenebilir '' ' Protokolün iç içe türünü 'T' ve 'Muhtemelen amaçlanan eşleşmesi' T 'gerektirir (aka' Gözlemci ') uymuyor 'AnyObject' ' Bunu nasıl düzelteceğinizle ilgili bir fikriniz var mı? – hendra

+0

@hendra: Sınıfınızı jenerik yapmak zorundasınız: class ConcreteObservable : Gözlemlenebilir {...} '. –

+0

Hm, bu gerçekten bana mantıklı gelmiyor. Eğer bu sınıfı üzücü gibi genel olarak tanımlarsam, ConcreteObservable'ın başlatılması sırasında bir “Gözlemci” nin somut bir türünü ilan etmem gerekir. Ancak 'Gözlemciye' uyan herhangi bir nesne 'ConcreteObservable'ı gözlemleyebilmelidir. Ya da yanlış bir şey mi aldım? – hendra

İlgili konular