关于ios:Swift类中的静态数组错误

Error on Static Array in Swift Class

我正在使用Swift开发一个应用程序。我从scnnode为此创建了一个子类:

1
2
3
4
5
6
7
8
9
10
11
12
13
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中多次初始化该类之后,我希望使用Charge.charges访问它们。但由于一些未知的原因,只有最后一个实例可用,它占据了Charge.charges[0]

我试图通过在ViewController中添加属性var test = [Charge]()来跟踪对象移动,并在每次启动ViewController中的充电时调用test.append(charge)。然后,当我想获得所有的费用时,Charge.charges损失了大部分费用,但test没有!有人能告诉我这件事吗?还是Xcode中的bug?

注意,我使用调试工具来跟踪这个问题。结果发现,在第二次初始化完成后,Charge.charges就丢失了它的第一个内容,但在执行Charge.charges.append(self)之后,第一个内容仍然存在。

编辑:碳化功能

1
2
3
4
5
6
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错误。

1
2
3
4
5
6
7
8
9
10
11
12
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的实例:

1
2
3
4
5
for var i = 0; i < 3; i++ {
        _ = Charge()
}

print(Charge.charges.count)

控制台打印3

试着检查你的Charge.carbonAtom()静态方法。我怀疑charges数组的清晰值。


好了,伙计们,我找到了!

有一些信息是我不提供的(我认为这是无关的),在主管班:

1
2
3
4
5
6
7
8
9
10
11
12
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
    }
}

在视图控制器中

1
2
3
4
5
6
@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中移除。

我试着在苹果文档中搜索这个信息,但没有用。如果他们能更全面地记录下来:/

谢谢你们的帮助,伙计们:)我用来复制错误的分治方法确实有助于缩小问题的范围。