我是否需要在 init(coder) 和 init(size) 中都注入属性?
Do I need to inject properties in both init(coder) and init(size)?
我正在尝试使用 constructor
(init
) 在我的 SpriteKit
项目中设置 property
值。由于 swift
不继承 init
methods
它并不总是像添加一个干净的 init()
方法并从那里获取它那样简单。我的项目要求我同时包含 init(size)
和 init(coder)
方法。没关系。
然而,这似乎也意味着我需要在两个 init
方法中注入我的 properties
。对我来说这似乎有点多余,但是 compiler
迫使我这样做。所以,我的问题是,这是这样做的方法,还是有更简洁的方法,所以我不需要使用两个设置相同 property
值的 init
methods
?代码如下所示:
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)
}
}
...和 class 调用 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)
}
通常不使用编码器初始化(例如,您仅以编程方式创建场景)。然后你可以存根出所需的编码器初始化:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
编辑:正如 Ron 指出的那样,如果您使用编辑器创建场景并从 SKS 文件加载,则编码器 init 是您必须实现的。
你可以通过在你的 let 语句中定义它来做到这一点,前提是 self
没有被使用,或者通过 lazy
.
class GameScene: SKScene {
let myVariable: SKShapeNode = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
override init(size: CGSize) {
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
class GameScene: SKScene {
lazy var myVariable: SKShapeNode = {
var node = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
//Maybe we want to add it to the scene here
return node
}
override init(size: CGSize) {
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
我正在尝试使用 constructor
(init
) 在我的 SpriteKit
项目中设置 property
值。由于 swift
不继承 init
methods
它并不总是像添加一个干净的 init()
方法并从那里获取它那样简单。我的项目要求我同时包含 init(size)
和 init(coder)
方法。没关系。
然而,这似乎也意味着我需要在两个 init
方法中注入我的 properties
。对我来说这似乎有点多余,但是 compiler
迫使我这样做。所以,我的问题是,这是这样做的方法,还是有更简洁的方法,所以我不需要使用两个设置相同 property
值的 init
methods
?代码如下所示:
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)
}
}
...和 class 调用 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)
}
通常不使用编码器初始化(例如,您仅以编程方式创建场景)。然后你可以存根出所需的编码器初始化:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
编辑:正如 Ron 指出的那样,如果您使用编辑器创建场景并从 SKS 文件加载,则编码器 init 是您必须实现的。
你可以通过在你的 let 语句中定义它来做到这一点,前提是 self
没有被使用,或者通过 lazy
.
class GameScene: SKScene {
let myVariable: SKShapeNode = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
override init(size: CGSize) {
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
class GameScene: SKScene {
lazy var myVariable: SKShapeNode = {
var node = SKShapeNode(rectOf: CGSize(width: 200, height: 200))
//Maybe we want to add it to the scene here
return node
}
override init(size: CGSize) {
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}