Swift Class 中的静态数组错误
Error on Static Array in Swift Class
我正在使用 swift 开发应用程序。为此,我从 SCNNode 创建了一个子class:
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 中多次启动 class 之后,我想使用 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
}
我刚刚测试过,没有任何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
数组的明确价值。
好的,我找到了!
在 Charge class:
中有我没有提供的信息(我认为这是无关紧要的)
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
}
}
并在 ViewController
@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 文档中搜索此信息,但无济于事。如果他们能更全面地记录它就好了:/
感谢大家的帮助 :) 我用来复制错误的分而治之的方法确实有助于缩小问题范围
我正在使用 swift 开发应用程序。为此,我从 SCNNode 创建了一个子class:
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 中多次启动 class 之后,我想使用 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
}
我刚刚测试过,没有任何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
数组的明确价值。
好的,我找到了!
在 Charge class:
中有我没有提供的信息(我认为这是无关紧要的)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
}
}
并在 ViewController
@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 文档中搜索此信息,但无济于事。如果他们能更全面地记录它就好了:/
感谢大家的帮助 :) 我用来复制错误的分而治之的方法确实有助于缩小问题范围