我一直试图改变场景中SKSpriteNode的纹理,但是XCode不断给我错误"类型' SKNode'没有会员' texture'"。但是,我输入了一个if is语句,因此它应该将其读作SKSpriteNode。我想知道是否有任何其他解决方案,以便能够更改场景中SKSpriteNode的纹理。谢谢!
for child in children {
if child.name == "Enemy" || child.name == "FinalEnemy" {
if child is SKSpriteNode {
child.texture = SKTexture.init(image: #imageLiteral(resourceName: "Ninja58"))
}
}
}
答案 0 :(得分:3)
您问运行时环境“这个SKNode实际上是SKSpriteNode”,但编译器仍然将子视为SKNode。
您需要获取对SKSpriteNode的引用以使编译器满意。
您可以通过更改
来实现if child is SKSpriteNode
要
if let child = child as? SKSpriteNode
第二个使用可选绑定来创建一个名为child的新变量,该变量在if块内有效并且是SKSpriteNode。
如果child不是SKSpriteNode,那么这将传递此if语句,并且代码将不会运行,因此您将拥有所需的行为。
您的其余代码应该通过进行此更改来工作。
在Knight0fDragon的评论后编辑
你可以在这里将条件嵌入到for循环中,使其更紧凑......
for child in children where child.name == "Enemy" || child.name == "FinalEnemy" {
guard let child = child as? SKSpriteNode else { continue }
child.texture = ...
}
嗯......这并不像我想要的那样好,我想在for循环条件中选择绑定...
也许这是可能的,但现在这样做:)
由于评论受限而被Knight0fDragon编辑:
请试一试,只能在XCode 9+中使用,并且演示可能是不必要的,我无权访问XCode来测试它。
for child in ArraySlice<SKSpriteNode>(children) as [SKSpriteNode]
where ["Enemy","FinalEnemy"].contains(child.name ?? "") {
child.texture = ...
}