我正在尝试使用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'
你能解释一下为什么会出现这种错误吗?
答案 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
运算符:
==