gpt4 book ai didi

swift - 像使用类一样使用协议(protocol)时出错

转载 作者:行者123 更新时间:2023-11-30 10:02:10 25 4
gpt4 key购买 nike

我有一个这样的协议(protocol):

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
}

我收到此错误:

Binary operator '===' cannot be applied to two 'Moveable' operands

还尝试使用“==”而不是“===”

在另一个依赖于前一个函数的函数中:

func removeMoveable(mov: Moveable) {
if checkMoveable(mov) {
self.moveables = moveables.filter({$0 !== mov})// <- Error
}
}

我收到此错误:

Cannot convert value of type 'Moveable' to expected argument type 'AnyObject?'

如果“Moveable”是一个类而不是一个协议(protocol),则不会出现这些错误。

最佳答案

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

如果您希望您的协议(protocol)仅被类采用,请如此声明:

protocol Movable: class { //...

或者让它扩展一个已经仅限于类的协议(protocol):

protocol Movable: NSObjectProtocol { //...

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

protocol Movable: Equatable { //...

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

关于swift - 像使用类一样使用协议(protocol)时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37848071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com