2015-10-21 22 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()方法應該沒有問題。我現在把它列入我的問題 –