早上好,在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")
}**
}
答案 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)
}