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'
あなたは私に説明できますか?
回答ありがとうございます。私はそれを受け入れた、それは明らかに私の質問への答えです:)悲しいことに、それは私の問題を完全に解決しません。 「AnyObject」を実装する '' Observer''プロトコルを定義します。次に、 'Observable'を実装する' ConcreteObservable'クラスを作成します。私は 'typealias T = Observer'を定義します。 タイプ 'ConcreteObservable'がプロトコル 'Observable'''に準拠していませんプロトコルにネストされたタイプ 'T''と 'が必要です。' T '(別名' Observer ')が準拠していません「AnyObject」へ これを修正する方法はありますか? – hendra
@hendra:クラスを汎用化する必要があります: 'class ConcreteObservable:Observable {...}'。 –
これは本当に私には意味がありません。私がこのクラスを悲しいようにジェネリックと定義すると、 'ConcreteObservable'の初期化時に' Observer'の具体的な型を宣言する必要があります。しかし、Observerに準拠するオブジェクトは、私の「Concrete Observable」を観察できるはずです。それとも、何か間違ったことがありましたか? – hendra