我是否需要在 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)
}

}