尝试将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
}
然而,如果您将以下代码粘贴到游乐场,它会按预期编译并执行:
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)
问题是,FakeShapeNode
和SKShapeNode
之间的相关区别是什么?
修改
根据@ Knight0fDragon的建议,下面提醒相关的初始化规则可能会有所帮助:
假设您为任何新属性提供默认值 在子类中引入,适用以下两个规则:
规则1 如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类 指定的初始化者。
规则2 如果您的子类提供了所有超类指定初始值设定项的实现 - 可以通过按照继承来继承它们 规则1,或通过提供自定义实现作为其一部分 定义 - 然后它自动继承所有的超类 便利初始化者。
即使您的子类添加了更多便利初始值设定项,这些规则也适用。
答案 0 :(得分:0)
你不能有一个方便的init调用super的方便init,它必须是一个委托初始化器。不幸的是,游乐场中有一个允许它工作的错误,但在应用程序中,您将收到您看到的错误。