2016-03-22 8 views
2

私はスイフト2で簡単なオブザーバmixinを構築しようとしています。 ここでは、部。プロトタイプのスイフトジェネリックス:演算子 '==='はタイプ '_'と 'Self.T'のオペランドには適用できません

protocol Observable{ 

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

私は拡張子を使用ミックスインを作成するには:

extension Observable{ 

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

をこれは、コンパイラエラーを作成します。このエラーが発生している理由Binary operator '===' cannot be applied to operands of type '_' and 'Self.T'

あなたは私に説明できますか?

答えて

2

"同一-TO" 演算子===のみ参照 タイプ、classの即ちインスタンスに適用することができます。 ==オペレータが定義しなければならないことを意味する(TEquatableの種類を制限、あるいは

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

:一つの可能​​な解決策はAnyObjectにジェネリック型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

回答ありがとうございます。私はそれを受け入れた、それは明らかに私の質問への答えです:)悲しいことに、それは私の問題を完全に解決しません。 「AnyObject」を実装する '' Observer''プロトコルを定義します。次に、 'Observable'を実装する' ConcreteObservable'クラスを作成します。私は 'typealias T = Observer'を定義します。 タイプ 'ConcreteObservable'がプロトコル 'Observable'''に準拠していませんプロトコルにネストされたタイプ 'T''と 'が必要です。' T '(別名' Observer ')が準拠していません「AnyObject」へ これを修正する方法はありますか? – hendra

+0

@hendra:クラスを汎用化する必要があります: 'class ConcreteObservable :Observable {...}'。 –

+0

これは本当に私には意味がありません。私がこのクラスを悲しいようにジェネリックと定義すると、 'ConcreteObservable'の初期化時に' Observer'の具体的な型を宣言する必要があります。しかし、Observerに準拠するオブジェクトは、私の「Concrete Observable」を観察できるはずです。それとも、何か間違ったことがありましたか? – hendra

関連する問題