【问题标题】:Is it safe (or good programming style) to initialize a lazy var with nil vars?使用 nil var 初始化惰性 var 是否安全(或良好的编程风格)?
【发布时间】:2020-01-27 18:53:36
【问题描述】:

让我稍微解释一下我的意思,因为它有点难以理解。

我正在为电子游戏创建原型。每个级别都从名为SceneLogicSKScene 继承主要规则:

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,iconBottomHUDnil,对于级别 2 textTopHUDnil...但是应用程序不会崩溃,因为 var 是 lazy,它不会某些级别不需要调用。

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

【问题讨论】:

  • 你为什么怀疑它不安全?
  • 为什么不将这些字段只添加到与它们相关的LevelN 类中?
  • @Sweeper 我刚开始使用lazy vars,我仍在努力了解它们的潜力和弱点:) 我问是因为我害怕错过一些东西并在代码中产生一些问题
  • @Alexander-ReinstateMonica 是的,这可能是实现它的更好方法,但我想在不重复自己的情况下处理这些方法。在代码中,我将添加一些处理分数、时间等的方法...
  • 你可以创建一个HUDDisplayable协议,然后你可以继承huds的3种类型,比如protocol HUDTopDisplayable: HUDDisplayable {}protocol HUDBottomDisplayable: HUDDisplayable {}等等,然后你可以做默认实现对于他们来说,如果您为所有 hud 共享相同的实现,并且只采用您的场景需要的协议

标签: ios swift xcode lazy-initialization


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2013-03-13
    • 1970-01-01
    • 2010-11-06
    • 2017-12-27
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多