在Swift中扩展SCNNode

时间:2015-01-16 22:20:56

标签: swift scenekit

我想在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")
    }
}

- >运算符被标记为错误"一行上的连续声明必须用;"分隔。

我知道这是不对的,但如果我幽默的Xcode,那么#34;修复"它如下:

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

哪些是胡说八道,然后Xcode抱怨"预期声明"。

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

1 个答案:

答案 0 :(得分:8)

您可以这样做:

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

将从基类继承指定的初始化程序。

如果你想指定一个带有几何的自己的初始化器,你必须调用基类的指定初始化器,所以我说这将是你想要的:

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翻译(自动,我相信)的初始化工具。我相信这是一个方便的初始化程序,即使它没有特别标记,我个人说这是自动头文件翻译的错误/限制。 The documentation具体说:

  

为了保持一致性和简洁性,Objective-C工厂方法在Swift中被映射为便捷初始化器。

不要对评论中的abstract这个词感到困惑;这是HeaderDoc标签,用于简短描述方法,即" abstract"在an abridgement or summary意义上使用。