使用协议时的错误,就好像它们是课程一样



我有这样的协议:

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实例,因此第一个(使===工作)可能是您想要的。

最新更新