我正在使用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 –