需要初始化吗?(编码器aDecoder:NSCoder){fatalError(“ init(coder :)尚未实现”)}

时间:2018-09-04 20:30:16

标签: sprite-kit

早上好,在Spritekit中,我的代码失败了,因为GKComponent必须执行:

a。我不需要“必需的init”。 b。在运行时,它调用此方法而不是正常的init()并失败。 C。 super.init(coder:aDecoder)无法解决我的调用问题

问题:一种用于调用我的init而非此强制性init的解决方案

在其他答案中,提出了使用super.init(coder: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 :(得分:1)

所需的init是系统必需的;当系统自动加载您的组件时,它将被调用。以接口构建器为例。您可以查看this answer了解更多信息。您的实体添加到了场景编辑器中吗?

因此,您需要专注于创建实体的方式。如果要调用自定义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)
}

答案 1 :(得分:0)

在初始化之前,所有变量都需要分配一个值。由于您的shadow没有值,因此编译器会强迫您覆盖必需的init,以便为shadow提供值。

要解决此问题,只需使阴影变懒:

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)
}