2017-01-30 1 views
1

Я получаю пару таких ошибок в нескольких моих программах и пытаюсь их исправить. Пример. Когда я ставлю размер вместо кодера, он скажет мне его неверный и изменит его обратно на кодер.Невозможно преобразовать значение типа CGSize в ожидаемый тип аргумента NSCoder

func reset() { 
      self.removeAllChildren() 
     var viewSize = view?.bounds.size 
     backgrounMusicPlayer.stop() 
     replayButton.isHidden = true 
     let gameScene = GameScene(coder: viewSize) //where error is 
     let transition = SKTransition.flipHorizontal(withDuration: 0.5) 
     gameScene.scaleMode = SKSceneScaleMode.aspectFill 
     self.scene!.view?.presentScene(gameScene, transition: transition) 
    } 
+1

Почему вы передаете ViewSize в объект GameScene? чего вы пытаетесь достичь? –

+2

Ошибка довольно ясна. – rmaddy

+1

Я предполагаю, что вы пытаетесь сделать 'GameScene (размер: viewSize)' и XCode кричит на вас, чтобы сделать его «GameScene (coder: viewSize)»? – Knight0fDragon

ответ

2

Предполагая, что ваш GameScene класс является подклассом SKScene, он не имеет инициализатор с coder меткой.

Просто измените GameScene(coder: viewSize) на GameScene(size: viewSize)

3

Проблема заключается в вашей инициализации GameScene объекта ... как следует ошибка.

let gameScene = GameScene(coder: viewSize) //where error is 

Вы проходите объект CGSize, когда этот инициализатор ожидает объект NSCoder. Я предполагаю, что GameScene подкласс SKScene, вы должны инициализировать с

let gameScene = GameScene(size: viewSize) 
0

Если это SpriteKit проект, класс GameScene не нужен размер и требует только имя файла .sks, который представляют сцену. (Размер будет установлен в качестве собственности на этот файл) Попробуйте это, было бы восстановить и представить игровую сцену снова

if let scene = GameScene(fileNamed:"GAME_SCENE_FILE_NAME") { 
     scene.replayButton.isHidden = true 
     let transition = SKTransition.flipHorizontal(withDuration: 0.5) 
     scene.scaleMode = .aspectFill 
     self.view!.presentScene(scene, transition: transition) 
    } 
3

Чтобы избежать написать неправильный синтаксис, который вы могли бы использовать XCode автодополнение. Control + Пробел запускает функцию автозаполнения Xcode, также, если вы хотите знать, доступную инициализации методы относительно общего класса, как SKScene вы просто написать:

enter image description here

Выполнение этого вы можете немедленно увидеть входные свойства и требуемые типы.

О вашем случае у вас есть класс с именем GameScene, что подкласс SKScene и вы пытаетесь сделать:

SKScene.init(coder: <#T##NSCoder#>) 

Obviusly вы не можете передать viewSize в качестве входного параметра для этого метода инициализации. Вы должны использовать init(size: CGSize) методу


Детали:

Сейчас мы говорим о init(coder: NSCoder). Процедура сохранения состояния вашего вида на диск известна как сериализация. Обратное - десериализация - восстановление состояния объекта с диска.

override func encode(with aCoder: NSCoder) { 
    // Serialize your object here 
} 

override init() { 
    super.init() 
} 

required init?(coder aDecoder: NSCoder) { 
    // Deserialize your object here 
    fatalError("init(coder:) has not been implemented") 
} 

Эти методы необходимы в пользовательский класс, чтобы поговорить с Interface Builder, например, объекты в раскадровку, что сериализовать состояние этого объекта на диске и десериализации его при использовании раскадровки, но если вы не Не добавляйте никаких новых свойств в свой подкласс, вы также можете не писать собственный код сериализации и десериализации для подкласса.

0

У меня есть эта строка в моем GameViewController.swift. Он пытался заставить меня «исправить» мой код, чтобы использовать «кодер» вместо «размера» и NSCoder был типом .:

let scene = GameScene(size: view.bounds.size) 

Я закомментирована этой часть моего кода в моем GameScene.Swift. Это исправило мою проблему.

/* 
    required init?(coder aDecoder: NSCoder) { 
     //  theSelf = self 

     //  fatalError("init(coder:) has not been implemented") 
     super.init(coder: aDecoder) //VL:4/1/2015 had to comment out for some reason 
    } 
*/ 

Интуиция помогла мне разобраться в этом. Я выполнил поиск NSCoder в своем проекте и нашел это. Что по сути изменилось, как в GameScene. Этот проект начался, по крайней мере, еще до xcode 6, что, вероятно, поэтому.

 Смежные вопросы

  • Нет связанных вопросов^_^