Swift中的Convenience Init,参数较少

时间:2014-10-05 01:34:13

标签: swift

我正在尝试执行以下代码,但是我收到了编译错误。我想初始化没有参数因为所有都设置为默认值但我仍然需要使用超类的指定初始化程序。我希望能够为新的AimNode

调用AimNode()
class AimNode: SKSpriteNode {

    override init() {
        super.init(imageNamed: "aim")
    }

    required init(coder aDecoder: NSCoder) {

    }
}

1 个答案:

答案 0 :(得分:2)

您的子类(AimNode)需要调用超类(SKSpriteNode)的指定初始值设定项。如快速编程指南的Initializer Chaining部分所述,规则是:

  

简化指定与便利之间的关系   初始化程序,Swift应用以下三个委托规则   初始化程序之间的调用:

     

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

     

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

     

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

SKSpriteNode的相应指定初始值设定项为:

init(texture: SKTexture!, color: UIColor!, size: CGSize)

因此,您需要创建SKTexture,选择颜色并设置大小。幸运的是,这很容易:

class AimNode: SKSpriteNode {

    // NOTE: I arbitrarily picked white for the color. I believe that's the default, but I don't know for sure.
    override init() {
        let texture = SKTexture(imageNamed: "aim")
        super.init(texture: texture, color: UIColor.whiteColor(), size: texture.size())
    }

    // NOTE: You'll have to implement this too, if you don't have anything custom, you can just call the super implementation
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}