Неустранимая ошибка: init (кодер :) не был реализован.Где ошибка при запуске - PullRequest
0 голосов
/ 28 апреля 2019

Picture of code

Я не понимаю, как исправить ошибку.Если кто-то понимает, пожалуйста, помогите!

class GameScene: SKScene {
    let player = SKSpriteNode(imageNamed: "playerShip")
    let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)

    var gameArea: CGRect

    override init(size: CGSize)
    {
        let maxAspectRatio: CGFloat = 16.0/9.0
        let playableWidth = size.height/maxAspectRatio
        let margin = (size.width - playableWidth)/2
        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
        super.init(size: size)
    }

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

Я пытаюсь установить границы для объектов на экране.Когда я писал super.init(size: size), Xcode автоматически создал требуемый init?(coder aDecoder: NSCoder), но когда он запускается, я получаю ошибку:

Поток 1: Неустранимая ошибка: init (кодер :) не был реализован

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Подобно состояниям oaccamsrazor, если вы добавляете инициализатор в ваш класс, вы также должны реализовать любые необходимые инициализаторы в суперклассе.Тот факт, что вы нажимаете init?(coder aDecoder: NSCoder), указывает на то, что init(size: ...) не вызывается, вероятно потому, что вы создаете свою сцену из файла .sks.

init?(coder aDecoder: NSCoder) будет вызываться при создании вашегосцена из файла .sks, поэтому вы не можете иметь fatalError() там.По сути, просто реализуйте ваш инициализатор, если вам есть что инициализировать.В противном случае удалите все инициализаторы, и требование init?(coder aDecoder: NSCoder) исчезнет.

0 голосов
/ 28 апреля 2019

Поскольку вы переопределили указанный инициализатор для SKScene с помощью вашего метода override init(size: CGSize) и, следовательно, должны реализовать этот метод required init?(coder aDecoder: NSCoder), чтобы разрешить пользовательский класс SKScene (ваш класс GameScene), сериализация объекта.

Эта старая статья может помочь вам объяснить:

Что такое init-кодер aDecoder?

Если вы пытаетесь инициализировать переменную gameArea, почему бы просто не попробовать что-то вроде установки gameArea в переопределении sceneDidLoad()? (действительно ужасный код ниже):

class GameScene: SKScene {
    let player = SKSpriteNode(imageNamed: "playerShip")
    let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)

    var gameArea: CGRect?

    override func sceneDidLoad() {
        let maxAspectRatio: CGFloat = 16.0/9.0
        let playableWidth = size.height/maxAspectRatio
        let margin = (size.width - playableWidth)/2

        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
    }

    <<more of your code>>
}

и исключить override init(size: CGSize)

...