首页 > 解决方案 > 我需要在 init(coder) 和 init(size) 中注入属性吗?

问题描述

我正在尝试使用( )property在我的项目中设置值。由于不继承它并不总是像添加一个干净的方法并从那里获取它那样简单。我的项目要求我同时包含和方法。没关系。SpriteKitconstructorinitswiftinit methodsinit()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)
}

标签: iosconstructorsprite-kitinitialization

解决方案


通常不使用 coder init(例如,您仅以编程方式创建场景)。然后你可以只存根所需的编码器初始化:

required init(coder aDecoder: NSCoder) {
  fatalError("init(coder:) has not been implemented")
}

编辑:正如 Ron 所指出的,如果您使用编辑器创建场景并从 SKS 文件加载,则 coder init 是您必须实现的。


推荐阅读