无法将类型“[SKNode]”的值分配给类型 'SKSpriteNode!'

Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'

我正在使用 SpriteKit 在 Swift 3 中编写一个 Galaga 风格的游戏,但我一直收到一个错误

Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'

谁能解释一下这是什么意思,以便我以后自己修复它,并给我一个可能的解决方案?

这是我得到错误的函数:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    for touch in touches {
        let location = (touch as UITouch).location(in: self)
        if fireButton = self.nodes(at: location) {
            shoot()
        } else {
            let touchLocation = touch.location(in: self)
            spaceship.position.x = touchLocation.x
        }
    }
}

我在 if fireButton = self.nodes(at: location)

行收到错误

函数 self.nodes(at: location) returns 与 location 相交的所有 SKNode 的数组。发生错误是因为您试图将整个 SKNodes 数组(即 [SKNode])分配给仅引用单个节点的变量。

另请注意,由于self.nodes(at: location) returns 所有与特定位置相交的节点,您将需要遍历节点数组以找到您要查找的节点。

要遍历数组,我建议替换行

if fireButton = self.nodes(at: location) {
        shoot()
}

let nodes = self.nodes(at: location)
for node in nodes {
    if node.name == "fireButton" {
        shoot()
    }
}

然后在你声明的地方 fireButton 给它起一个名字

fireButton.name = "fireButton" 
// just an exmaple, rather store these names as constants somewhere in your code

这是最简单的方法,但您需要记住您为精灵指定的所有名称。一种替代方法是创建一个 FireButton class 作为 SKSpriteNode 的子 class,将 fireButton 声明为 FireButton 的实例,而不是检查名称,你可以做到

if node is FireButton { 
    shoot()
}

希望对您有所帮助!