无法向SKShapeNode子类添加方便初始化器



尝试将convenience init添加到SKShapeNode子类会产生两个编译器错误:

class Shape : SKShapeNode {
    convenience init(diameter: CGFloat) {
        self.init(circleOfRadius: diameter / 2) // error: Use of 'self' in delegating initializer before self.init is called
    } // error: Self.init isn't called on all paths in delegating initializer
}

然而,如果您将以下代码粘贴到playground中,它将按预期编译并执行:

import CoreGraphics
import SpriteKit
class FakeShapeNode : SKNode {
    convenience init(circleOfRadius radius: CGFloat) {
        self.init()
    }
}
class FakeShape : FakeShapeNode {
    convenience init(diameter: CGFloat) {
        self.init(circleOfRadius: diameter / 2)
    }
}
let shape = FakeShape(diameter: 3)

问题是,FakeShapeNodeSKShapeNode之间的相关差异是什么?

编辑

根据@Knight0fDragon的建议,下面提醒一下相关的初始化规则可能会有所帮助:

假设您为您创建的任何新属性提供默认值在子类中引入以下两条规则:

规则1如果你的子类没有定义任何指定初始化式,它会自动继承它的所有父类指定的初始化。

规则2如果你的子类提供了它的所有父类指定初始化器的实现——要么通过继承它们来实现规则1,或者通过提供自定义实现作为其定义——那么它会自动继承所有的超类方便初始值设定项。

这些规则仍然适用,即使你的子类添加了更多方便的初始化式。

你不能让一个便利初始化调用父类的便利初始化,它必须是一个委托初始化器。不幸的是,在操场上有一个错误,允许它工作,但在应用程序中,你会收到你所看到的错误。

要了解便利单元是如何工作的,请参阅https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html

最新更新