为SKScene创建一个自定义的initalizer,它会覆盖便利init?(fileNamed :)

时间:2017-02-13 17:29:06

标签: swift sprite-kit swift3 initialization xcode8

我正在尝试创建一个便捷初始化程序,它覆盖SKScene中的convenience init? (fileNamed:)初始化程序,以便我可以将一些初始值传递给场景,同时取消归档.sks文件。问题是,当我尝试这样做时,似乎SKScene(GameScene)的子类无法看到超类的convenience init? (fileNamed:)。以下是我的一些尝试:

Class GameScene : SKScene {

var stage : Int?

override init(size: CGSize) {
    super.init(size: size)
}

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

convenience init?(fileNamed: String, stage: Int) {
    self.init(fileNamed: fileNamed)  // Compiler error-- Argument labels '(filenamed:)' do not match any available overloads
    self.stage = stage
}

我发现的另一种尝试建议作为解决方法:

Class GameScene : SKScene {

var stage : Int?

override init(size: CGSize) {
    super.init(size: size)
}

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

convenience init?(fileNamed: String) {
    self.init(fileNamed: fileNamed) // Error at run time: EXC_BAD_ACCESS (code=2, address=0x16fc1bff0) 
}

convenience init?(fileNamed: String, stage: Int) {
    self.init(fileNamed: fileNamed)  
    self.stage = stage
}

调试器显示无限循环GameScene.init(fileNamed : String) -> GameScene?

我如何做到这一点?我需要继续我的生活! (和这个项目......)

2 个答案:

答案 0 :(得分:3)

难道不是这么简单吗?

[HttpGet, Route("dateRange/{start:datetime}/{end:datetime}")]
public IActionResult Get(DateTime start, DateTime end)
{            
    if (start < end)
    {
        return Json(_Repo.GetByDateRange(start, end));
    }
    return BadRequest("Invalid Date Range");
}

您可以在显示页面之前设置舞台属性,如果需要,可以调用设置功能根据舞台加载信息/图形。

我知道它并不像你想做的那样优雅,但也许有时最简单的答案是最好的?

答案 1 :(得分:3)

Swift有关于便利初始化器的规则:

  

规则1:指定的初始化程序必须调用指定的初始化程序   来自其直接的超类。

     

规则2:便捷初始化程序必须从中调用另一个初始化程序   同一个班级。

     

规则3:便利初始化程序必须最终调用指定的   初始化程序。

初始化程序public convenience init?(fileNamed filename: String)本身就是SKNode上的一个便利初始化程序,因此尝试从您自己的便利初始化程序中调用它会破坏规则2。

如果您在Xcode快速提示中看到,可以从便捷初始化程序调用的唯一初始化程序是required init?(coder aDecoder: NSCoder),它符合规则3.