首页 文章

super.init()Swift中的递归问题

提问于
浏览
1

我正在使用Swift开发一个SpriteKit游戏,我需要继承SKSpriteNode . 在init()(不是覆盖)函数中,我初始化子类的属性然后调用super:

init(selector: Selector, delegateScene: SKScene, text: String, position: CGPoint) {
    self.delegateScene = delegateScene

    self.labelNode = SKLabelNode()
    self.labelNode.position = CGPointZero
    self.labelNode.text = text

    self.selector = selector

    super.init()
}

我在super.init()处设置了一个断点,并且在子类init的开头就发生了EXC_BAD_INSTRUCTION异常 . 这是错误:

(文件路径).swift:12:7:致命错误:使用未实现的初始化程序'init(texture:color:size :)'用于类'Energies.Button'

1 回答

  • 2

    如果从 SKSpriteNode 继承,则应调用指定的初始值设定项 . 在这种情况下,需要 init(texture:color:size:) . 因此,如果您使用的是图像或纹理,则需要像这样调用 super.init

    super.init(texture: texture, color: nil, size: CGSize(width: 100, height: 100))
    

    请注意,您还需要在初始化时设置大小 .

    但在这种情况下你可以忘记上面的内容,因为你不是在寻找 SKSpriteNode 的子类,而是 SKNode 的子类 . 如果将声明中的超类从 SKSpriteNode 更改为 SKNode ,则应立即生效 .

    您还需要在 super.init() 之后添加您的标签添加到节点,否则您的标签将不会显示,您的节点将为空 .

相关问题