无法为SKShapeNode子类

时间:2015-10-25 11:34:43

标签: swift sprite-kit initialization subclass 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
}

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

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,或通过提供自定义实现作为其一部分   定义 - 然后它自动继承所有的超类   便利初始化者。

     

即使您的子类添加了更多便利初始值设定项,这些规则也适用。

1 个答案:

答案 0 :(得分:0)

你不能有一个方便的init调用super的方便init,它必须是一个委托初始化器。不幸的是,游乐场中有一个允许它工作的错误,但在应用程序中,您将收到您看到的错误。

要了解工作的方便性,请参阅https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html