Swift 协议中的泛型:运算符“===”不能应用于“_”类型的操作数和 'Self.T'

Swift generics in protocol: operator '===' cannot be applied to operands of type '_' and 'Self.T'

我正在尝试使用 Swift 2 构建一个简单的观察者混合体。 这里只是相关部分。

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{ [=13=] === observer }
        if let _ = index{
            self.observers.removeAtIndex(index)
        }
    }   
}

这会产生编译器错误:Binary operator '===' cannot be applied to operands of type '_' and 'Self.T'

你能解释一下为什么会出现这个错误吗?

"identical-to"运算符===只能应用于reference 类型,即 class 的实例。一种可能的解决方案是 将通用类型 T 限制为 AnyObject (协议 所有 类 隐式符合):

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 { [=10=] === observer }) {
            self.observers.removeAtIndex(index)
        }
    }   
}

或者,将 T 限制为 Equatable 类型(这意味着 必须为类型定义 == 运算符):

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