我有一些[NSDictionary]填充了我正在检查值的书籍,以便更好地在UICollectionView中显示内容。 如果它包含多个ISBN号,我正在检查一个密钥。如果它,我会想要将它们显示为单独的书籍。关键是'isbn',如果值类似于'[“9788252586336”,“9788203360510”]'我想将它们显示为单独的书籍。所以他们将成为两本“平等”的书,但是有着不同的isbn数字。
以下是发生的事情:
继承代码
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()
}
在代码中它说:“问题就在这里”。嗯......问题在那里。 当它使用此数组[“9788252586336”,“9788203360510”]进入该循环时,它将首先打印第一个数字,然后打印第二个数字。 然后当它需要currentBook。我改变之前的值是“9788252586336; 9788203360510”,只有第一个isbn数字“9788252586336”。然后我获取整个currentBook并将其附加到数组(tempArray),该数组将用于稍后在UICollectionView中显示书籍。 当第二次迭代开始时,isbn数将为“9788203360510”,我将isbn数设置为currentBook中的数字,就像第一次迭代一样。 现在发生了奇怪的事情。当currentBook get附加到(tempArray)时,它应该包含相同的书,但具有不同的isbn数字。但它实际上包含相同的fu @%$书,其中包含相同的isbn数字。 不知何故,第二次迭代增加了两本具有相同isbn数字的书籍,第一本应该存在的书已经消失......
图片1在第一次迭代之后,图片2在第二次迭代之后。如果你看一下关键字“isbn”,你会发现代码中有些东西搞砸了......
如何发生这种情况以及如何解决?
答案 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)
}