使用协议时的错误就像它们是类

时间:2016-06-16 00:41:43

标签: swift sprite-kit protocols

我有这样的协议:

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”是一个类而不是一个协议,则不会出现这些错误。

1 个答案:

答案 0 :(得分:1)

标识运算符===仅适用于引用类型(类)。您的协议可以由引用或值类型采用,因此只有该类型信息的协议不能与身份运算符一起使用。

如果您希望您的协议仅被类采用,请以此方式声明:

protocol Movable: class { //...

或者让它扩展已经限制为类的协议:

protocol Movable: NSObjectProtocol { //...

等价运算符==仅适用于Equatable的类型。如果您想在两个Movable上使用该运算符,则需要声明类型为Movable,它还必须符合Equatable

protocol Movable: Equatable { //...

由于您似乎正在寻找特定的SKSpriteNode实例,因此第一个(使===工作)可能就是您想要的。