Swift类

时间:2015-10-21 13:28:35

标签: ios arrays xcode swift static-variables

我正在使用swift开发一个应用程序。我为此创建了SCNNode的子类:

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
}

2 个答案:

答案 0 :(得分: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数组的值是否清楚。

答案 1 :(得分:0)

OKAY GUYS我找到了它!

在Charge类中有一些我不提供的信息(我认为这是无关紧要的):

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)行中,该方法会自动从removeFromParentNode()调用charge。因此,当第二次充电初始化时,Charge.selectedCharge指向的费用将从Charge.charges中删除。

我尝试在Apple文档中搜索此信息,但无济于事。如果只是他们更全面地记录它:/

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