用 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,iconBottomHUD
是 nil
,对于级别 2 textTopHUD
是 nil
...但是应用程序不会崩溃,因为var 是 lazy
并且不会在某些级别被调用。
我的问题是:这是一种好的编程风格吗?这样使用 lazy
安全吗?
关于惰性属性的事情是它推迟了初始化代码的执行。所以在你的情况下它并不重要,因为它们实际上是零。所以你defer
init
基本上什么都没有。如果我是你,我基本上会把它作为一个计算属性:
private lazy var iconBottomHUD: SKSpriteNode = {
guard let node = childNode(withName: "iconBottom") as? SKSpriteNode else {
fatalError()
}
return node
}
或者像@JavierRivarola 提到的那样,使其基于协议。
让我更好地解释一下我的意思,因为它有点难以理解。
我正在为电子游戏制作原型。每个级别都从名为 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,iconBottomHUD
是 nil
,对于级别 2 textTopHUD
是 nil
...但是应用程序不会崩溃,因为var 是 lazy
并且不会在某些级别被调用。
我的问题是:这是一种好的编程风格吗?这样使用 lazy
安全吗?
关于惰性属性的事情是它推迟了初始化代码的执行。所以在你的情况下它并不重要,因为它们实际上是零。所以你defer
init
基本上什么都没有。如果我是你,我基本上会把它作为一个计算属性:
private lazy var iconBottomHUD: SKSpriteNode = {
guard let node = childNode(withName: "iconBottom") as? SKSpriteNode else {
fatalError()
}
return node
}
或者像@JavierRivarola 提到的那样,使其基于协议。