Swift Class 中的静态数组错误

Error on Static Array in Swift Class

我正在使用 swift 开发应用程序。为此,我从 SCNNode 创建了一个子class:

class Charge: SCNNode {
    static var tagCounter = 0 //to give every charge a unique tag
    static var charges = [Charge]() //to have a pointer that can access all charges
    static var selectedCharge: Charge?  //pointer to selected charge

    override init() {
        super.init()
        super.geometry = Charge.carbonAtom()
        Charge.tagCounter++
        self.chargeTag = Charge.tagCounter
        Charge.charges.append(self)
    }
}

然后在 ViewController 中多次启动 class 之后,我想使用 Charge.charges 访问它们。但是不知道什么原因,只有最后一个实例可用,占用Charge.charges[0].

我试图通过在 ViewController var test = [Charge]() 中添加 属性 来跟踪物体运动,并在每次 ViewController 中发起充电时调用 test.append(charge)。然后,当我想访问所有费用时,Charge.charges 会丢失大部分费用,但 test 不会!任何人都可以启发我吗?还是 Xcode 中的错误?

n.b。我使用调试工具来跟踪这个问题。原来Charge.charges第二次初始化一结束就失去了第一个内容,但是Charge.charges.append(self)

刚执行完第一个内容还存在

编辑:carbonAtom 函数

class func carbonAtom() -> SCNGeometry {
    let carbonAtom = SCNSphere(radius: 0.8)
    carbonAtom.firstMaterial!.diffuse.contents = UIColor.redColor()
    carbonAtom.firstMaterial!.specular.contents = UIColor.whiteColor()
    return carbonAtom
}

我刚刚测试过,没有任何Xcode错误。

class Charge: NSObject {
static var tagCounter = 0 //to give every charge a unique tag
    static var charges = [Charge]() //to have a pointer that can access all charges

    override init() {
        super.init()
//        super.geometry = Charge.carbonAtom()
        Charge.tagCounter++
//        self.chargeTag = Charge.tagCounter
        Charge.charges.append(self)
    }
}

创建 3 Change 个实例:

for var i = 0; i < 3; i++ {
        _ = Charge()
}

print(Charge.charges.count)

控制台打印3.

尝试检查您的 Charge.carbonAtom() 静态方法。我怀疑 charges 数组的明确价值。

好的,我找到了!

在 Charge class:

中有我没有提供的信息(我认为这是无关紧要的)
override func removeFromParentNode() {
    super.removeFromParentNode()
    for var i = 0; i<Charge.charges.count; i++ {
        let charge = Charge.charges[i]
        if Charge.selectedCharge != nil {
            if charge == Charge.selectedCharge! {
                Charge.charges.removeAtIndex(i)
            }
        }
        break
    }
}

并在 ViewController

@IBAction func addCharge(sender: AnyObject) {
    let charge = Charge()
    scene.rootNode.addChildNode(charge) //root of problem
    Charge.selectedCharge = charge
    print(Charge.charges.count)
}

实际情况是,在行 scene.rootNode.addChildNode(charge) 中,该方法自动从 charge 调用 removeFromParentNode()。因此,Charge.selectedCharge 指向的电荷将在第二个电荷初始化时从 Charge.charges 中移除。

我尝试在 Apple 文档中搜索此信息,但无济于事。如果他们能更全面地记录它就好了:/

感谢大家的帮助 :) 我用来复制错误的分而治之的方法确实有助于缩小问题范围