gpt4 book ai didi

ios - 用 nil var 初始化惰性 var 是否安全(或良好的编程风格)?

转载 作者:行者123 更新时间:2023-12-01 22:04:30 26 4
gpt4 key购买 nike

让我更好地解释一下我的意思,因为这有点难以理解。

我正在为电子游戏创建原型(prototype)。每个级别都继承了 SKScene 的主要规则。调用SceneLogic :

class SceneLogic: SKScene, SKPhysicsContactDelegate {
// Set up the physics, the contacts, touches and so on...
}

class Level1: SceneLogic { }
class Level2: SceneLogic { }

每个级别都有自己的 .sks文件,它指定要在 HUD 中显示的不同图标。为了创建一种“游戏引擎”,我想在 SceneLogic 中初始化各种图形。类(class) lazy var如果当前关卡不需要,则忽略它们。

让我用一个例子来解释
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, iconBottomHUDnil , 对于 2 级 textTopHUDnil ...但应用程序不会崩溃,因为 var 是 lazy并且不会在某些级别上调用它​​。

我的问题是:这是一种好的编程风格吗?使用安全吗 lazy这样?

最佳答案

关于惰性属性的事情是它延迟了初始化代码的执行。因此,在您的情况下,这并不重要,因为它们实际上为零。所以你defer init基本上什么都没有。如果我是你,我基本上要么将其作为计算属性:

private lazy var iconBottomHUD: SKSpriteNode = {
guard let node = childNode(withName: "iconBottom") as? SKSpriteNode else {
fatalError()
}
return node
}

或者像@JavierRivarola 提到的那样,让它基于协议(protocol)。

关于ios - 用 nil var 初始化惰性 var 是否安全(或良好的编程风格)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59937193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com