【发布时间】:2020-01-27 18:53:36
【问题描述】:
让我稍微解释一下我的意思,因为它有点难以理解。
我正在为电子游戏创建原型。每个级别都从名为SceneLogic 的SKScene 继承主要规则:
class SceneLogic: SKScene, SKPhysicsContactDelegate {
// Set up the physics, the contacts, touches and so on...
}
class Level1: SceneLogic { }
class Level2: SceneLogic { }
每个级别都有自己的.sks 文件,该文件指定要在HUD 中显示的不同图标。为了创建一种“游戏引擎”,我想通过lazy var 初始化SceneLogic 类中的每一种图形,如果当前关卡不需要它,则忽略它们。
让我用一个例子来解释
class SceneLogic: SKScene, SKPhysicsContactDelegate {
// Text, available only for level 1
private lazy var textTopHUD = childNode(withName: "textTop") as! SKLabelNode
// Icon, available only for levels 3,4,5
private lazy var iconBottomHUD = childNode(withName: "iconBottom") as! SKSpriteNode
// Icon, available only for level 2
private lazy var iconLeftHUD = childNode(withName: "iconLeft") as! SKSpriteNode
func initGame(level: Int) {
switch mode {
case 1: // Level 1
textTopHUD.text = "Level 1"
case 2: // Level 2
iconLeftHUD.position = ....
}
}
}
事实是:对于级别 1,iconBottomHUD 是 nil,对于级别 2 textTopHUD 是 nil...但是应用程序不会崩溃,因为 var 是 lazy,它不会某些级别不需要调用。
我的问题是:这是一种好的编程风格吗?这样使用lazy安全吗?
【问题讨论】:
-
你为什么怀疑它不安全?
-
为什么不将这些字段只添加到与它们相关的
LevelN类中? -
@Sweeper 我刚开始使用
lazyvars,我仍在努力了解它们的潜力和弱点:) 我问是因为我害怕错过一些东西并在代码中产生一些问题 -
@Alexander-ReinstateMonica 是的,这可能是实现它的更好方法,但我想在不重复自己的情况下处理这些方法。在代码中,我将添加一些处理分数、时间等的方法...
-
你可以创建一个
HUDDisplayable协议,然后你可以继承huds的3种类型,比如protocol HUDTopDisplayable: HUDDisplayable {},protocol HUDBottomDisplayable: HUDDisplayable {}等等,然后你可以做默认实现对于他们来说,如果您为所有 hud 共享相同的实现,并且只采用您的场景需要的协议
标签: ios swift xcode lazy-initialization