将NSDictionary附加到[NSDictionary]会产生意外结果

时间:2016-06-23 21:33:19

标签: ios swift loops dictionary

我有一些[NSDictionary]填充了我正在检查值的书籍,以便更好地在UICollectionView中显示内容。 如果它包含多个ISBN号,我正在检查一个密钥。如果它,我会想要将它们显示为单独的书籍。关键是'isbn',如果值类似于'[“9788252586336”,“9788203360510”]'我想将它们显示为单独的书籍。所以他们将成为两本“平等”的书,但是有着不同的isbn数字。

以下是发生的事情:

  1. 继承代码

    func parserFinishedSuccesfully(data: NSMutableArray){
    self.tempArray = []
    if !data.isEqual(nil) && data.count > 0
    {
            for i in (0 ..< data.count)
            {
                var currentBook = NSDictionary()                   
    
                if !((data[i] as? NSDictionary)!.valueForKey("isbn") as? String)!.isEmpty
                {
                    //If the book do have isbn then I'll want to display it
                    currentBook = data[i] as! NSDictionary
    
                    if let isbn = currentBook.valueForKey("isbn") as? String
                    { //isbn could be "9788252586336; 9788203360510"
    
                        let isbnNumbersRecieved = isbnNumbers(isbn)
                         //gives: ["9788252586336", " 9788203360510"]
    
                        if isbnNumbersRecieved.count >= 2 
                        {
                            //We are dealing with several isbn numbers on one book
                            for isbn in isbnNumbersRecieved 
                            { //The problem lies here!
                                print("This is the isbn: \(isbn)")
                                currentBook.setValue(isbn, forKey: "isbn")
                                self.tempArray.append(currentBook)
                            }
    
                        }
                        else
                        {
                            //Only one isbn
                             //currentBook.setValue(isbnNumbersRecieved.first, forKey: "isbn")
                            //self.tempArray.append(currentBook)
                        }
                    }else{
                        //No isbn, no want
                        print("No isbn")
                    }  
                }
    
            }
        print(self.tempArray)
        self.collectionView.reloadData()
    
    }
    
  2. 在代码中它说:“问题就在这里”。嗯......问题在那里。 当它使用此数组[“9788252586336”,“9788203360510”]进入该循环时,它将首先打印第一个数字,然后打印第二个数字。 然后当它需要currentBook。我改变之前的值是“9788252586336; 9788203360510”,只有第一个isbn数字“9788252586336”。然后我获取整个currentBook并将其附加到数组(tempArray),该数组将用于稍后在UICollectionView中显示书籍。 当第二次迭代开始时,isbn数将为“9788203360510”,我将isbn数设置为currentBook中的数字,就像第一次迭代一样。 现在发生了奇怪的事情。当currentBook get附加到(tempArray)时,它应该包含相同的书,但具有不同的isbn数字。但它实际上包含相同的fu @%$书,其中包含相同的isbn数字。 不知何故,第二次迭代增加了两本具有相同isbn数字的书籍,第一本应该存在的书已经消失......

    图片1在第一次迭代之后,图片2在第二次迭代之后。如果你看一下关键字“isbn”,你会发现代码中有些东西搞砸了......

    图片1 Picture 1

    图片2 Picture 2

    如何发生这种情况以及如何解决?

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为currentBook引用类型,而不是类型。您要将同一本书currentBook的两个引用添加到数组中。

作为一个简单的修复,您可以在修改字典并将其添加到数组之前copy()。一个更强大的修复方法是让所有模型都改为值类型。

进一步阅读:

答案 1 :(得分:0)

您为for循环中的每个项目使用相同的字典对象,因此这个结果。请尝试以下操作,并告诉我它是否有效。

//We are dealing with several isbn numbers on one book
 for isbn in isbnNumbersRecieved
 { //The problem lies here!
   print("This is the isbn: \(isbn)")

   let tempDict = NSDictionary()
   tempDict.setValue(isbn, forKey: "isbn")

   //currentBook.setValue(isbn, forKey: "isbn")
   self.tempArray.append(tempDict)
 }