我有这样的协议:
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
}
}
我得到此错误:
无法将"移动"类型的值转换为预期参数类型 '任何对象吗?'
如果"可移动"是一类,而不是作为协议,那么这些错误都不会出现。
身份运算符===
仅适用于参考类型(类)。您的协议可以通过参考或价值类型来采用,因此唯一类型信息的内容是该协议不能与身份操作员一起使用。
如果您希望仅通过类采用您的协议,请这样声明:
protocol Movable: class { //...
或使其扩展到已经仅限于类的协议:
protocol Movable: NSObjectProtocol { //...
等效运算符==
仅适用于Equatable
的类型。如果您想在两个Movable
s上使用该操作员,则需要声明该类型为Movable
,它也必须符合Equatable
:
protocol Movable: Equatable { //...
由于您似乎正在寻找一个特定的SKSpriteNode
实例,因此第一个(使===
工作)可能是您想要的。