我有这样的协议:
protocol Moveable {
var moveSpeed: Float { get set }
}
在我的一个不符合“可移动”的类中,我有一个这样的函数:
var moveables: [Moveables]()
func checkMoveable(mov: Moveable) -> Bool {
for m in moveables {
if m === mov { // <- Error
return true
}
}
return false
}
我收到此错误:
二元运算符'==='不能应用于两个'可移动'操作数
也尝试用“==”代替“===”
在另一个依赖前一个函数的函数中:
func removeMoveable(mov: Moveable) {
if checkMoveable(mov) {
self.moveables = moveables.filter({$0 !== mov})// <- Error
}
}
我收到此错误:
无法将“可移动”类型的值转换为预期的参数类型 'AnyObject?'
如果“Moveable”是一个类而不是一个协议,则不会出现这些错误。
答案 0 :(得分:1)
标识运算符===
仅适用于引用类型(类)。您的协议可以由引用或值类型采用,因此只有该类型信息的协议不能与身份运算符一起使用。
如果您希望您的协议仅被类采用,请以此方式声明:
protocol Movable: class { //...
或者让它扩展已经限制为类的协议:
protocol Movable: NSObjectProtocol { //...
等价运算符==
仅适用于Equatable
的类型。如果您想在两个Movable
上使用该运算符,则需要声明类型为Movable
,它还必须符合Equatable
:
protocol Movable: Equatable { //...
由于您似乎正在寻找特定的SKSpriteNode
实例,因此第一个(使===
工作)可能就是您想要的。