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)
}
}
}
我正在尝试使用 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)
}
}
}