2015-10-21 20 views
2

我正在使用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 
} 
+0

正是由于你初始化你的方式静态变量。每次创建Charge类的新实例时,都会将费用重置为新的数组。您提供了一个类型初始值设定项或使用'dispatch_once'只初始化一次。看到这个问题:http://stackoverflow.com/questions/24137212/initialize-class-method-for-classes-in-swift –

+0

@ZoffDino,静态属性不会重新初始化每个实例。 –

+0

我发现与@ t4nhpt类似的结果。我无法在应用中重现此内容。值得注意的是,游乐场在节点上调用.clone()作为镜像的一部分,这可能导致创建指数数量的节点。所以我已经看到了你描述的问题的相反情况,但是我无法得到一个案例,其中.count小于预期。请尝试创建一个MCVE。 http://stackoverflow.com/help/mcve –

回答

0

OKAY GUYS我发现了!

有,我不提供相关信息班主任(我认为这是无关紧要):

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 
    } 
} 

,并在视图控制器

@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文档中搜索此信息,但无济于事。如果只有他们更全面地记录它:/

谢谢你的帮助球员:)分而治之的方法我用复制的bug确实有助于缩小问题

3

我刚才测试了,没有任何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阵列的价值。

+0

感谢您的测试。但是,我仍然有这个问题。我给出了更多的细节:我通过在故事板上按下按钮来实例化课程,并通过按另一个按钮来访问Charge.charges。所以在类实例化之间有一段空闲时间。我的carbonAtom()方法应该没有问题。我现在把它列入我的问题 –