ios - 我需要在 init(coder) 和 init(size) 中注入属性吗?
问题描述
我正在尝试使用( )property
在我的项目中设置值。由于不继承它并不总是像添加一个干净的方法并从那里获取它那样简单。我的项目要求我同时包含和方法。没关系。SpriteKit
constructor
init
swift
init
methods
init()
init(size)
init(coder)
但是,这似乎也意味着我需要properties
在这两种init
方法中注入我的。对我来说,这似乎有点多余,但compiler
迫使我这样做。所以,我的问题是,这是这样做的方法,还是有更清洁的方法,所以我不需要使用两个init
methods
设置相同property
值的方法?代码如下所示:
class GameScene: SKScene {
let myVariable: SKShapeNode
override init(size: CGSize) {
myVariable = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
myVariable = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
super.init(coder: aDecoder)
}
}
...和班级呼吁GameScene
:
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
let scene = GameScene(size: view.frame.size)
scene.scaleMode = .aspectFill
scene.size = view.frame.size
scene.anchorPoint = CGPoint(x:0 , y: 1)
view.presentScene(scene)
}
解决方案
通常不使用 coder init(例如,您仅以编程方式创建场景)。然后你可以只存根所需的编码器初始化:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
编辑:正如 Ron 所指出的,如果您使用编辑器创建场景并从 SKS 文件加载,则 coder init 是您必须实现的。
推荐阅读
- c++ - 使用多重集输入的整数出现的次数
- ffmpeg - 如果给定 M3U8 播放列表,如何按需创建 TS 片段
- html - 焦点输入按钮和登录按钮在html中发生冲突
- python-3.x - 为什么```message.showinfo()```会打开2个窗口而不是1个?
- android - 谁能想出一个自定义渲染器解决方案来改变 Android 中下划线的颜色?
- xslt - 如何检查特定属性是否存在于 XML 中的所有子节点中?
- java - 在 Apache Flink 的元组字段中按最大值过滤
- laravel - 提高更新大表的性能,Laravel
- android - Volley 缓存响应
- android-studio - Flutter 在运行应用程序时显示 CachedNetworkImage 错误,我使用的是 NetworkImage 而不是 CachNetworkImage?