требуется init? (кодер aDecoder: NSCoder) {fatalError ("init (кодер :) не был реализован")} - PullRequest
0 голосов
/ 04 сентября 2018

Добрый день, в Spritekit мой код не работает, потому что GKComponent обязывает меня реализовать:

а. «требуемый init» мне не нужен. б. Во время выполнения он вызывает это вместо моего обычного init () и терпит неудачу. с. super.init (кодер: aDecoder) не решает мою проблему с названием

Вопрос: Решение для вызова моего init вместо этого принудительно необходимого init

В других ответах предлагается решение использовать super.init (кодер: aDecoder), но оно не решило мою проблему, не вызывая его.

required init?(coder aDecoder: NSCoder) {

    fatalError("init(coder:) has not been implemented")
}

// Этот код должен добавить простое затмение под спрайтом, чтобы создать // эффект тени, сделав его GKComponent и добавив его в GKEntity.

     import Foundation
        import GameplayKit
        import SpriteKit

    //GKEntity to add GKComponents
        class Entity: GKEntity{    

    //A variable that is a GKComponent defined as ShadowComponent: GKComponent    

var shadow: ShadowComponent

//My init

override init() {

shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))

super.init()
addComponent(shadow)

        }

//Forced by compiler to have it

**required init?(coder aDecoder: NSCoder) {

            fatalError("init(coder:) has not been implemented")
        }**

    }

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Всем переменным должно быть присвоено значение до инициализации. Поскольку у вашей тени нет значения, компилятор заставляет вас переопределить необходимый init, чтобы вы могли дать тени значение.

Чтобы это исправить, просто сделайте тень ленивой:

lazy var shadow = 
{
    [unowned self] in
    let shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))
    addComponent(shadow)
    return shadow
}()

Затем, при первом использовании тени, она создаст и добавит компонент для вас.

Единственная причина, по которой нам нужно сделать его ленивым, - это аспект addComponent. Ваш код может быть написан так, чтобы избежать необходимости использовать ленивый, но вам нужно будет вызвать функцию для добавления вашего компонента.

let shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))

func addComponents(){
    addComponent(shadow)
}
0 голосов
/ 06 сентября 2018

Требуемая инициализация требуется системой; он будет вызван, когда система автоматически загрузит ваш компонент. С построителем интерфейса, например. Вы можете взглянуть на этот ответ для получения дополнительной информации. Добавлена ​​ли ваша сущность в редактор сцен?

Так что вам нужно сосредоточиться на том, как создается ваша сущность. Если вы хотите вызвать свой пользовательский init, вам нужно инициировать его программно.

Я могу предложить сделать необходимую инициализацию, если вы хотите продолжать использовать вашу сущность в редакторе сцен:

required init?(coder aDecoder: NSCoder) {
  shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))
  super.init(coder: aDecoder)
  addComponent(shadow)
}
...