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

时间:2016-03-22 17:37:38

标签: swift generics swift-extensions swift-protocols

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

protocol Observable{

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

要创建mixin,我使用扩展名:

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'

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

1 个答案:

答案 0 :(得分:2)

“same-to”运算符if x > 10 || x < 0 || y > 10 || y < 0 return 0 end 只能应用于引用 类型,即===的实例。一种可能的解决方案是 将泛型类型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 { $0 === observer }) { self.observers.removeAtIndex(index) } } } 限制为T类型(这意味着 必须为类型定义Equatable运算符:

==