SKNode子类生成错误:无法为没有参数的类型"X"调用初始化程序

Cra*_*lot 7 sprite-kit swift

SKNodes可以使用空的初始化程序进行初始化,例如let node = SKNode().SKNode但是,子类化会破坏此功能.在子类化之后SKNode,Xcode在尝试在子类上使用空初始化程序时会生成此错误:

Cannot invoke initializer for type "X" with no arguments
Run Code Online (Sandbox Code Playgroud)

假设SKNodeSubclass是子类SKNode,该行let node = SKNodeSubclass()生成此错误.

是否有可能从SKNode继承并使用像SKNode一样的空初始化器?

class StatusScreen: SKNode {

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    init(gridWidth: CGFloat, deviceHeight: CGFloat) {
        super.init()

        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

ABa*_*ith 10

如果您查看Swift编程语言:初始化,在自动初始化程序继承下,自动继承超类的指定初始化程序的规则之一是:

如果您的子类没有定义任何指定的初始化器,它会自动继承其所有超类指定的初始化器.

这假设您为引入的任何新属性提供默认值.

既然你定义指定初始化器init(gridWidth: CGFloat, deviceHeight: CGFloat)子类不继承init()SKNode.因此,为了能够使用StatusScreen()你需要init()在你的StatusScreen类中覆盖:

class StatusScreen: SKNode {
    // ...

    override init() {
        super.init()

        // Do other stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

let node1 = StatusScreen()
let node2 = StatusScreen(gridWidth: 100, deviceHeight: 100)
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!