Swift addObject多次相同地发生?

Swift addObject多次相同地发生?,swift,ios8,xcode6,Swift,Ios8,Xcode6,我是xcode/iOS开发的新手。我用objective c编写了一个教程应用程序,它工作起来很有魅力。我的下一次尝试是用swift重写它 发生了一些非常奇怪的事情。“objects”NSMutableArray每次在xml文档中找到一个节点时,都会填充相同的项。(而不是附加)。我尝试简单地创建对象:var objects=NSMutableArray(),然后使用objects.addObject(currentFacility),但同样的事情发生了 日志粘贴基本上是第一次登录到解析器进入的公

我是xcode/iOS开发的新手。我用objective c编写了一个教程应用程序,它工作起来很有魅力。我的下一次尝试是用swift重写它

发生了一些非常奇怪的事情。“objects”NSMutableArray每次在xml文档中找到一个节点时,都会填充相同的项。(而不是附加)。我尝试简单地创建对象:var objects=NSMutableArray(),然后使用objects.addObject(currentFacility),但同样的事情发生了

日志粘贴基本上是第一次登录到解析器进入的公司节点。然后在for循环中,它打印出公司添加到的对象数组的索引和内容

我试图删掉不相关的代码。但我不确定原因是什么,因此我不清楚这种冗长的说法

class MasterViewController: UITableViewController, NSXMLParserDelegate {
    var detailViewController: DetailViewController? = nil
    var objects = [Facility]()
    var currentFacility = Facility()
    var currentValue = ""
    var counter = 0

    func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) {
        currentValue = ""
        if(elementName == "Facility") {
            counter += 1
            NSLog("LOG: entered co \(counter) \n")
        }
    }

    func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI:         String!, qualifiedName qName: String!) {
      //[Code here that correctly catches sub nodes omitted for brevity]
      // finished parsing job - add it to the array
        if(elementName == "Facility") {
            objects.append(currentFacility)

            //var desc = currentFacility.description()
            for index in 0...(self.objects.count - 1) {
                var obPrint = self.objects[index] as Facility
                var desc2 = obPrint.description()
                NSLog("\(desc2) and index is \(index)")
            }
            NSLog("LOG: exited co \(counter) \n")
        }
    }
}
下面的日志粘贴包含对象数组的打印输出,为了可读性删除了一些:

DID START document
日志中的解析器:输入了co 1
ECO 完成弗里德利工业大道5100号,指数为0
对数: 退出co 1
日志:进入co 2
ADVANCED FLEX INC.工厂2 3905加利福尼亚圣北东哥伦比亚高地,指数为0
ADVANCED FLEX INC.工厂2 3905加利福尼亚州圣北东哥伦比亚高地 索引为1
LOG:退出的co 2
LOG:进入的co 3
H。 B.FULLER公司Monator区3900号杰克逊街北东哥伦比亚高地和 指数为0
H.B.FULLER CO.Monator DIV.3900 JACKSON ST.N.E。 哥伦比亚高地和指数为1
H.B.富勒公司君主分部。 3900杰克逊圣北哥伦比亚高地,指数为2
对数: 退出的co 3
更多相同,为简洁起见进行切割。

.

日志:退出co 10
日志:进入co 11
阿特拉斯制造厂5250 INDL。 大道。N.E.FRIDLEY和索引为0
阿特拉斯制造5250 INDL。大道。 N.E.弗里德利和索引为1
阿特拉斯制造5250 INDL。大道。N.E。 弗里德利和索引为2
阿特拉斯制造公司5250 INDL。大道。N.E.弗里德利 索引为3
阿特拉斯制造公司5250 INDL。大道。N.E.弗里德利和 索引为4
阿特拉斯制造公司5250 INDL。大道。N.E.弗里德利和索引 is 5
阿特拉斯制造公司5250 INDL。大道。N.E.FRIDLEY和index是 6
阿特拉斯制造公司5250 INDL。大道。N.E.弗里德利指数为7
阿特拉斯制造公司5250 INDL。大道。N.E.FRIDLEY和索引为8
ATLAS 制造商5250 INDL。大道。N.E.弗里德利和索引为9
阿特拉斯制造公司。 5250英德尔。大道。N.E.弗里德利指数为11
对数:退出co 11 DID结束文档中的解析器


currentFacility
被声明为类本身的属性,并且只分配给一次(使用其默认值)。而且,
Facility
是一个函数,因此每次将它附加到数组中时,它都会将一个引用附加到同一实例中

更新
currentFacility
的属性时,您正在更新附加到数组中的所有属性,因为它们仍然引用相同的内容

如果要开始使用新的
currentFacility
,应在找到每个节点或附加到阵列后创建新实例:

self.currentFacility = Facility()

请删除复制错误时不需要的任何代码。有关更多信息,请参见。发生了什么事?为什么会这样?