我正在尝试使用 Swift 2 构建一个简单的观察者混合。 这里只是相关部分。
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)
}
}
}
这会产生编译器错误:二元运算符“===”不能应用于“_”和“Self.T”类型的操作数
您能向我解释一下为什么会出现此错误吗?
最佳答案
“identical-to”运算符===
只能应用于引用
类型,即类
的实例。一种可能的解决方案是
将泛型类型 T
限制为 AnyObject
(协议(protocol))
所有类都隐式符合):
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
类型(这意味着
必须为该类型定义 ==
运算符):
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)
}
}
}
关于协议(protocol) : operator '===' cannot be applied to operands of type '_' and 'Self.T' 中的 Swift 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161468/