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

Is it safe (or good programming style) to initialize a lazy var with nil vars?

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

我正在为电子游戏制作原型。每个级别都从名为 SceneLogic:

SKScene 继承主要规则
class SceneLogic: SKScene, SKPhysicsContactDelegate {
    // Set up the physics, the contacts, touches and so on...
}

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

每个级别都有自己的 .sks 文件,该文件指定要在 HUD 中显示的不同图标。为了创建一种 "game engine" 我想通过 lazy var 初始化 SceneLogic class 中的每一种图形,如果当前级别不需要它则忽略它们.

我举个例子解释一下

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 提到的那样,使其基于协议。