如何从 SKNode.children 数组访问 SKNode 子类方法?
Posted
技术标签:
【中文标题】如何从 SKNode.children 数组访问 SKNode 子类方法?【英文标题】:How do you access SKNode subclass methods from SKNode.children array? 【发布时间】:2019-05-10 12:07:13 【问题描述】:我有一个场景,其中包含许多子类 SKNode。我正在尝试访问每个子节点的方法,但收到错误“'SKNode' 类型的值没有成员'[成员名称]”。
Xcode 10.2 上的所有 Swift 5(如果相关?)。
import SpriteKit
class GameScene: SKScene
override func didMove(to view: SKView)
let slim = NamedNode(name: "Slim Shady")
let snoop = NamedNode(name: "Snoop Dog")
let shaggy = NamedNode(name: "Shaggy")
self.addChild(slim)
self.addChild(snoop)
self.addChild(shaggy)
for child in self.children
child.whatsMyName()
// ERROR: Value of type 'SKNode' has no member 'whatsMyName'
class NamedNode: SKNode
var standup = false
init(name: String)
super.init()
self.name = name
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
func whatsMyName()
print("My name is ", name as Any)
if self.name == "Slim Shady"
standup = true
如何从 Scene.children 数组中访问这些方法?有可能还是我应该改变机智?
谢谢!
【问题讨论】:
你怎么确定所有场景的孩子都是NamedNode
s?这会永远是真的吗?
【参考方案1】:
It is said here that
SKScene 的子节点属于 SKNode 类型。您想要访问 SKNode 子类的属性。在编译时,子节点被视为 SKNode。 你应该尝试给你的孩子施放,比如
对于self.children中的孩子 (child as?NamedNode).whatsMyName()
请记住,向下转换通常是一种代码味道。
【讨论】:
这与这样的额外问号一起使用:for child in self.children (child as? NamedNode)?.whatsMyName()
so 标记为已回答。您和@Sweeper 提出了关于不确定子节点是否实际上是 NamedNode 的观点,将来会尽量避免 代码气味。 (顺便说一句很棒的词)
您认为实现这一点的更好方法是什么?我的一个想法是将方法保留在父场景中,并让子节点只保存基本节点数据(名称等)。以上是关于如何从 SKNode.children 数组访问 SKNode 子类方法?的主要内容,如果未能解决你的问题,请参考以下文章