我有一些[NSDictionary]充满了我正在检查值的书,以更好地在UICollectionView中显示内容。我正在检查一个键是否包含几个ISBN号。如果可以,我希望将它们显示为单独的书。关键是'isbn',如果值类似于'[“ 9788252586336,” 9788203360510“]',我希望将它们显示为单独的书。因此,它们将成为两本“相等”的书,但书号不同。
这是发生了什么:
继承人的代码
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中的isbn编号。奇怪的事情现在发生了。当currentBook得到' 附加到(tempArray)的s应该包含同一本书,但具有不同的isbn数字。但实际上它包含同一fu @%$书,具有相同的isbn编号。不知何故,第二次迭代添加了具有相同isbn编号的2本书,而应该存在的第一本书就消失了...
图片1在第一次迭代之后,图片2在第二次迭代之后。如果查看键“ isbn”,您会发现代码中有些混乱……
这怎么会发生,我该如何解决?
发生这种情况是因为currentBook
是引用类型,而不是值类型。您正在将同一本书的两个引用添加currentBook
到数组。
作为一个简单的解决方案,您可以copy()
在修改字典并将其添加到数组之前先将其添加到字典中。一个更可靠的解决方案是改为使所有模型都使用值类型。
进一步阅读:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句