Нужно ли вводить свойства как в init (кодер), так и в init (размер)? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь установить значения 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)
}

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Вы можете просто сделать это, определив это в своем операторе 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)
}

}

1 голос
/ 06 марта 2020

Часто инициализация кодера не используется (например, вы создаете сцену только программно). Затем вы можете просто заглушить необходимый код инициатора:

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

Редактировать: Как указывает Рон, если вы используете редактор для создания сцены и загружаете, если из файла SKS, инициатор кодера это тот, который вы должны реализовать.

...