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

标签 swift initialization sprite-kit subclass

我正在使用 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() 处设置了一个断点,EXC_BAD_INSTRUCTION 异常紧接着在子类的 init 开始时发生。这是错误:

(file path).swift: 12: 7: fatal error: use of unimplemented initializer 'init(texture:color:size:)' for class 'Energies.Button'

最佳答案

如果你继承自SKSpriteNode,你应该调用指定的初始化器。在这种情况下,它需要是 init(texture:color:size:)。因此,如果您使用图像或纹理,则需要像这样调用 super.init:

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

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

但是在这种情况下你可以忘记上面的,因为你不是在寻找SKSpriteNode的子类,而是SKNode的子类。如果您将声明中的父类(super class)从 SKSpriteNode 更改为 SKNode,它应该会立即工作。

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

关于swift - Swift 中的 super.init() 递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25761538/

相关文章:

objective-c - 无效的 Swift 支持/SwiftSupport 文件夹为空

ios - Spritekit : how to make game screen view move upwards as node "jumps" along the y axis?

ios - 播放完毕后,我是否必须从父级手动移除发射器节点?

Swift 控制流(函数调用)

ios - 添加 Facebook 点赞按钮 iOS SWIFT

c++ - 使用{}初始化类(class)成员

objective-c - 如何编写一个自定义初始化程序来防止 viewDidLoad 被调用?

ios - 如何让 SKView 在解雇时触发其父 SKView 中的方法

swift - 命令行工具 Xcode 的控制台中没有打印任何内容

c++ - 为什么 'class'和 'main'中的相等表达式表现不同?