Ios 实例化类不起作用-swift

Ios 实例化类不起作用-swift,ios,scenekit,Ios,Scenekit,我在我的主类中有一个简单的函数调用来从我的多维数据集类创建一些实例,但我似乎无法将我的实例添加到场景中。我尝试在我的立方体类中返回self,但Swift不允许我在init中这样做 func addCubeLoop() { for var i = 0; i <= 0; ++i { cube = Cube(num: i, importedCube: importedCube1) cubeArray.append(cube) theScen

我在我的主类中有一个简单的函数调用来从我的多维数据集类创建一些实例,但我似乎无法将我的实例添加到场景中。我尝试在我的立方体类中返回self,但Swift不允许我在init中这样做

func addCubeLoop() {
    for var i = 0; i <= 0; ++i {
        cube = Cube(num: i, importedCube: importedCube1)
        cubeArray.append(cube)
        theScene.rootNode.addChildNode(cubeArray[i])
    }
}


class Cube: SCNNode {

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    init(num: Int, importedCube: SCNNode) {
        let _scale: Float = 60
        let cube: SCNNode = importedCube.copy() as! SCNNode

        super.init()

        cube.scale = SCNVector3Make(_scale, _scale, _scale)
        let node = SCNNode()            
        node.addChildNode(cube)
        node.position = SCNVector3Make(5, 20, 3)
        let collisionBox = SCNBox(width: 5.0, height: 5.0, length: 5.0, chamferRadius: 0)
        node.physicsBody?.physicsShape = SCNPhysicsShape(geometry: collisionBox, options: nil)
        node.physicsBody = SCNPhysicsBody.dynamicBody()
        node.physicsBody?.mass = 0.1
        node.physicsBody?.restitution = 0.8
        node.physicsBody?.damping = 0.5
        node.name = "dice" + String(num)
        node.physicsBody?.allowsResting = true
    }
}
func addCubeLoop(){

对于var i=0;i在
Cube
init
中创建的节点不作为其子节点添加

为了说明这个问题,我简化了下面的代码

func addCubeLoop() {
    for /* loop */ {
        // 1. create cube
        cube = Cube(num: i, importedCube: importedCube1)
        // 6. add cube to the scene's root node
        theScene.rootNode.addChildNode(cubeArray[i])
    }
}


class Cube: SCNNode {
    init(importedCube: SCNNode) {
        // 2. copy importedCube 
        let cube: SCNNode = importedCube.copy() as! SCNNode
        // configure cube  
        // ...          

        // 3. create node
        let node = SCNNode() 
        // 4. add cube (the copy) to node
        node.addChildNode(cube)
        // configure node
        // ...

        // 5. End of init
    }
}
对于循环中的每一次运行,都会发生这样的情况

  • 将创建一个新的多维数据集实例,并传递importedCube1

  • 在多维数据集初始值设定项中,复制导入的多维数据集参数。节点“多维数据集”现在是该参数的副本

  • 仍然在初始值设定项中,创建了一个新节点(称为“节点”)

  • 仍然在初始值设定项中,“多维数据集”(副本)被添加到“节点”中。此时,多维数据集是“节点”的子节点,但多维数据集实例本身(即节点)没有子节点

  • 初始化完成

  • 新创建的立方体实例将添加到场景的根节点

  • 此时有四个相关节点:

    • 根节点
    • 多维数据集实例节点
    • 名为“node”的节点
    • 导入的副本
    多维数据集实例节点是根节点的子节点。导入的副本是“节点”节点的子节点。但是,“节点”节点没有父节点


    修复方法是通过添加“节点”来确保所有节点都是层次结构的一部分节点到多维数据集实例初始化器中的
    self

    ahhh,从概念上讲,这非常有意义,谢谢David,我会尝试一下,并尽快回答您的问题。谢谢。非常好。我从类中删除了额外的SCNNode,而是将子节点添加到self中。