整洁,清洁访问SKNodes
问题描述:
我想整理一些我的SKScene代码。目前我有约11个参考SKNodes(一些是包含子节点的图层)。这些节点及其子节点经常被该类访问。我认为这样做的方式是:整洁,清洁访问SKNodes
将所有SKNode的子类别转换为另一个类别,例如,当前我在SKOIOS上定义了layerPause: SKNode?
。这将成为layerPause: PauseMenu
其中:
class PauseMenu: SKNode
{
lazy var lbBestTime: SKLabelNode = childNodeWithName("lbPersonalBest") as! SKLabelNode
}
然后,场景加载时,我可以简单地使用:
layerPause = pauseScene.childNodeWithName("pauseMenu")?.copy() as? SKNode
这将让我轻松地访问重要的子节点,而无需调用childNodeWithName
所有的时间。但不幸的是,PauseMenu类给出了一个错误,说我不能使用childNodeWithName
方法。
难道有人指着我正确的方向吗?也许有更好的方法来管理我的节点,或者我在PauseMenu子类中丢失了一些简单的东西,如上所述。
非常感谢,
答
这么近,你只需要添加一个明确的self
:
class PauseMenu: SKNode
{
lazy var lbBestTime: SKLabelNode =
self.childNodeWithName("lbPersonalBest") as! SKLabelNode
}
答
唯一缺少这里是self
:
class PauseMenu: SKNode {
lazy var lbBestTime: SKLabelNode = self.childNodeWithName("lbPersonalBest") as! SKLabelNode
}
在的情况下(懒惰)财产初始值设定项,你不能离开self
隐式......可能该初始化器被视为闭包(即使它不需要大括号,如果它是一个声明),关闭总是需要清楚的是他们是否捕获了self
。
如果你初始化layerPause
在你的问题,它的类型是SKNode
,你仍然无法使用新定义的lbBestTime
属性就可以了,虽然 - 所有的编译器知道是layerPause
是SKNode
。一定要告诉它layerPause
是PauseMenu
,然后您可以使用该类的自定义属性。
事实上,我认为懒惰的初始化可能会允许这些属性,但可悲的是它没有。相反,我在该类中添加了一个图层变量,删除了该子类,并通过初始化程序将该节点传递给该类。它不觉得非常优雅,但它是以前的改进 – Mason