addObject发生多次相同?

时间:2014-08-03 22:30:12

标签: swift ios8 xcode6

我是xcode / iOS dev的新手。我在目标c中编写了一个教程应用程序,它就像一个魅力。我的下一次尝试是在swift中重写它。

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

Log粘贴基本上是首次登录该解析器进入公司节点。然后在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")
        }
    }
}

下面的日志粘贴包含OBJECTS数组的打印输出,为了便于阅读,删除了一些:

  在DID START文档中的

解析器
LOG:输入了co 1
ECO   完成5100 INDUSTRIAL BLVD FRIDLEY和索引是0
日志:   退出co 1
LOG:进入co 2
高级FLEX INC.PLANT 2   3905 CALIFORNIA ST。 N.E. COLUMBIA HEIGHTS和索引是0
  ADVANCED FLEX INC.PLANT 2 3905 CALIFORNIA ST。 N.E.哥伦比亚高地   和索引是1
LOG:退出co 2
LOG:输入co 3
H.   B. FULLER CO.MONARCH DIV。 3900 JACKSON ST。 N.E. COLUMBIA HEIGHTS和   index是0左右.B。FULLER CO.MONARCH DIV。 3900 JACKSON ST。 N.E.   COLUMBIA HEIGHTS和索引是1 B. H. B. FULLER CO.MONARCH DIV。   3900 JACKSON ST。 N.E. COLUMBIA HEIGHTS和索引是2
LOG:   退出co 3更多相同,为简洁起见。

  点。

     

日志:已退出公司10日志:已进入合作伙伴11的ATLAS MFG。 5250 INDL。   BLVD。 N.E. FRIDLEY和指数是0
ATLAS MFG。 5250 INDL。 BLVD。   N.E. FRIDLEY和指数是1
ATLAS MFG。 5250 INDL。 BLVD。 N.E.   FRIDLEY和索引是2
ATLAS MFG。 5250 INDL。 BLVD。 N.E.弗里德利   和指数是3
阿特拉斯MFG。 5250 INDL。 BLVD。 N.E.弗里德利和   指数是4
阿特拉斯MFG。 5250 INDL。 BLVD。 N.E.弗里德利和指数   是5
ATLAS MFG。 5250 INDL。 BLVD。 N.E.弗里德利和指数是   6
阿特拉斯MFG。 5250 INDL。 BLVD。 N.E. FRIDLEY和指数是7
  ATLAS MFG。 5250 INDL。 BLVD。 N.E. FRIDLEY和指数是8
阿特拉斯   MFG。 5250 INDL。 BLVD。 N.E. FRIDLEY和指数是9
ATLAS MFG。   5250 INDL。 BLVD。 N.E. FRIDLEY和指数是11
LOG:已退出公司11   
在DID结束文件中的解析器

1 个答案:

答案 0 :(得分:0)

currentFacility被声明为类本身的属性,仅被赋值为一次(使用其默认值)。此外,Facilityreference type,因此每次将其附加到数组时,都会将引用附加到同一个实例。

当你更新currentFacility的属性时,你正在更新你附加到数组的所有属性,因为它们仍然引用相同的东西。

如果您想开始使用新的currentFacility,您应该在找到每个节点后或追加到数组后创建一个新实例:

self.currentFacility = Facility()