2016-06-23 4 views
0

UICollectionViewのコンテンツをよりよく表示するために値をチェックしている書籍がいくつかあります。 複数のISBN番号が含まれている場合は、キーのチェックを行っています。それが分かれば、私は別々の本としてそれらを表示したいと思うでしょう。キーは 'isbn'で、値が '["9788252586336"、 "9788203360510"]'のようなものであれば、別の書籍として表示したいと思うでしょう。だから、彼らは2つの "平等な"本になるだろうが、異なるisbn番号を持つ。[NSDictionary]にNSDictionaryを追加すると予期しない結果が発生する

はここで何が起こるかです:

  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() 
    
    } 
    

それは言う: "問題はここにあります"。まあ...問題はそこにあります。 この配列["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」を見れば、あなたはコードを台無しに何かがあることがわかります...

写真1 Picture 1

写真2 Picture 2

どのようにこれが起こるとすることができますどのように私はそれを修正するだろうか?

答えて

1

currentBook参照タイプではなく、タイプであるので、これが起こっています。同じブックに2つの参照、currentBookを配列に追加しています。

簡単な修正として、修正する前にcopy()辞書を修正して配列に追加することができます。より堅牢な修正は、すべてのモデルを代わりに値型にすることです。


さらに読書:

+0

あなたの権利のように見えます。しかし、currentBookを新しい変数に割り当てると、同じ結果が得られます。 NSDictionaryはStructなので、currentBookをコピーしないでください。新しい変数を参照しないでください。このように:http://stackoverflow.com/questions/24816754/how-to-copy-a-dictionary-in-swift – Starlord

+0

答えは正しいですが、私は値の型にする方法についてコメントすることができます。私はそれを値型にするために新しい変数に代入しようとしていますが、私は運がありません。 – Starlord

+0

'NSDictionary'はクラスであり、構造体ではありません。 'Dictionary'は構造体ですが、独自の' Book'構造体を作ることをお勧めします。 'copy()'を使ってみましたか? –

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) 
} 
+0

はい!しかし、currentBookの残りの値は、isbnだけでなく、tempDicにコピーする必要があります。 tempDic = currentBookを実行するとコピーが生成されますが、これは動作しません。 – Starlord

関連する問題