ios - 用 nil var 初始化惰性 var 是否安全(或良好的编程风格)?
问题描述
让我更好地解释一下我的意思,因为这有点难以理解。
我正在为电子游戏创建原型。每个级别都继承了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
如果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 级,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 提到的那样,让它基于协议。
推荐阅读
- eclipse - Eclipse - 如何找到丢失的右括号
- header - 如何使用okhttp3获取http响应头并决定是否获取响应体
- c# - 如何在 C# 中将 lambda 表达式与 asp.net DataList 一起使用
- node.js - 无法在 nodeJS 中获取 pm2 退出或停止事件
- javascript - 对象属性名称是否允许未定义?
- java - Eclipse,在安装 m2e 连接器时导入 maven 项目错误
- r - 对多个图像执行基本图像处理
- python - 使用 Python 打开 Excel 电子表格 (.xlsx)
- java - Apache Ignite Cache 设置与当前机器的亲和性
- javascript - 如何解决我的 GitHub 存储库中的依赖漏洞