UICollectionViewのコンテンツをよりよく表示するために値をチェックしている書籍がいくつかあります。 複数のISBN番号が含まれている場合は、キーのチェックを行っています。それが分かれば、私は別々の本としてそれらを表示したいと思うでしょう。キーは 'isbn'で、値が '["9788252586336"、 "9788203360510"]'のようなものであれば、別の書籍として表示したいと思うでしょう。だから、彼らは2つの "平等な"本になるだろうが、異なるisbn番号を持つ。[NSDictionary]にNSDictionaryを追加すると予期しない結果が発生する
はここで何が起こるかです:
相続人はコードのコードで
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"]でループに入ると、最初に最初の数字が印刷され、次に2番目の数字が印刷されます。 その後、currentBookを取る。最初のisbn番号が "9788252586336"の "9788252586336; 9788203360510"になる前の値を変更します。そして、私はcurrentBook全体を取り出し、それを後でUICollectionViewにブックを表示するのに使う配列(tempArray)に追加します。 2回目の反復が始まると、isbn番号は "9788203360510"になり、isbn番号は最初の反復と同じようにcurrentBookに設定されます。 今、奇妙なことが起こります。 currentBookがget(tempArray)に追加されると、同じ本が含まれているはずですが、isbn番号が異なります。しかし、実際には同じisbn番号を持つ同じfu @%$ブックを含んでいます。 何とか2番目の反復で同じisbn番号を持つ2冊の本が追加され、そこにある最初の本がなくなってしまった。
写真1は最初の反復の後にあり、写真2は2番目の反復の後である。あなたは、キー「ISBN」を見れば、あなたはコードを台無しに何かがあることがわかります...
どのようにこれが起こるとすることができますどのように私はそれを修正するだろうか?
あなたの権利のように見えます。しかし、currentBookを新しい変数に割り当てると、同じ結果が得られます。 NSDictionaryはStructなので、currentBookをコピーしないでください。新しい変数を参照しないでください。このように:http://stackoverflow.com/questions/24816754/how-to-copy-a-dictionary-in-swift – Starlord
答えは正しいですが、私は値の型にする方法についてコメントすることができます。私はそれを値型にするために新しい変数に代入しようとしていますが、私は運がありません。 – Starlord
'NSDictionary'はクラスであり、構造体ではありません。 'Dictionary'は構造体ですが、独自の' Book'構造体を作ることをお勧めします。 'copy()'を使ってみましたか? –