我正在使用swift开发一个应用程序。我创建SCNNode一个子类这样的:Swift类中静态数组的错误
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中的一个错误?
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
}
正是由于你初始化你的方式静态变量。每次创建Charge类的新实例时,都会将费用重置为新的数组。您提供了一个类型初始值设定项或使用'dispatch_once'只初始化一次。看到这个问题:http://stackoverflow.com/questions/24137212/initialize-class-method-for-classes-in-swift –
@ZoffDino,静态属性不会重新初始化每个实例。 –
我发现与@ t4nhpt类似的结果。我无法在应用中重现此内容。值得注意的是,游乐场在节点上调用.clone()作为镜像的一部分,这可能导致创建指数数量的节点。所以我已经看到了你描述的问题的相反情况,但是我无法得到一个案例,其中.count小于预期。请尝试创建一个MCVE。 http://stackoverflow.com/help/mcve –