在 Swift 中扩展 SCNNode

Extending SCNNode in Swift

我想在 Swift 中扩展 SCNNode(如果可能)。这是我的尝试:

class MyNode : SCNNode {

    override init(geometry: SCNGeometry) -> SCNNode {
        return super.init(geometry)
    }

    /* Xcode required this */
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

-> 运算符被标记为错误 "Consecutive declarations on a line must be separated by ;"。

我知道这是不对的,但如果我幽默 Xcode 它 "fixes" 如下:

override init(geometry: SCNGeometry); -> SCNNode {

这是胡说八道,然后 Xcode 抱怨 "Expected declaration"。

我不太了解 SCNNode 实现 - 如果我在 Xcode 中查看它,它都被声明为抽象的(在注释中)并且没有提供任何实现。文档没有建议从 SCNNode 扩展任何东西,你直接实例化它,所以我假设我应该能够扩展它。

你可以简单地做:

class MyNode : SCNNode {
    /* Xcode required this */
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

将从基class继承指定的初始化器。

如果你想指定你自己的采用几何体的初始化器,你必须调用基的指定初始化器class,所以我想这就是你想要的:

class MyNode : SCNNode {
    init(geometry: SCNGeometry) {
        super.init()
        self.geometry = geometry
    }
    /* Xcode required this */
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

您在 SCNNode.h 代码中看到的初始化程序是从 Objective C 方法 nodeWithGeometry 翻译而来的(我相信是自动翻译的)初始化程序。我相信这是一个方便的初始化程序,即使它没有特别标记为这样,我个人认为这是自动头文件翻译的 bug/limitation。 The documentation 具体说:

For consistency and simplicity, Objective-C factory methods get mapped as convenience initializers in Swift.

不要被评论里的abstract这个词搞糊涂了;这是 HeaderDoc tag for a short description of a method, i.e. "abstract" is used in the sense of an abridgement or summary.