2016-05-24 11 views
0

非常に大きなjsonファイルを読み込み、データを取得しています。私は現在、正しいデータを取り込めますが、配列に追加しようとすると、置き換えられます。私はこれは私が得るものである拡張子の配列を印刷するとき、「SG-ヘッダー見出し」 に一致する複数の値を検索するには、この拡張機能を使用して要素が追加される代わりに置き換えられるのはなぜですか?

func parseJSON(json: JSON){ 

    let predicate = { 
     (json: JSON) -> Bool in 
     if let jsonID = json["class"].string where jsonID == "sg-header-heading"{ 

      return true 

     } 
     return false 
    } 
    var backclass = ViewController() 
    let foundJSON = json.findmultiple(backclass, predicate: predicate) 

。しかし、私がそれを上に印刷すると、私はゼロになります。また、私は最後に6つの値の代わりに1つの値を取得するだけです。

enter image description here

extension JSON{ 

func findmultiple(viewclass: ViewController, @noescape predicate: JSON -> Bool) -> JSON? { 

    var backclass = ViewController() 

    if predicate(self) { 
     return self 
    } 
    else { 
     if let subJSON = (dictionary?.map { $0.1 } ?? array) { 
      for json in subJSON { 

       if let foundJSON = json.findmultiple(backclass, predicate: predicate) { 
        let shorten = foundJSON["html"].stringValue 
        let firstshort = shorten.componentsSeparatedByString(" ") 
        let secondshort = firstshort[1].componentsSeparatedByString("\r") 
        let classname = secondshort[0] 
        if(classname == "STUDY HALL (INSTRUCT)"){ 
         print("skip") 
        }else{ 
         backclass.importClass.append(classname) 
         print("fsgsfg \(backclass.importClass)") 
         //backclass.collection.reloadData() 
        } 


       } 
      } 
     } 
    } 

    return nil 
} 
} 
+0

あなたが再帰的であるとき、バッククラスは多くの時間を初期化しますか? –

+0

はい、実際そうです。 – johnson

答えて

3

あなたはまず、最も外側のコンテキスト(let foundJSON = json.findmultiple(predicate))からfindmultiple()を呼び出しています。コードが実行され、findmultiple()が実際に実行されると、var backclass = ViewController()の新しいインスタンスが作成されます。コードがループに入ると、再帰的にfindmultiple()が実行されます。コードがループに入ると、さらに新しいインスタンスが作成されます(backclass)。ループを通過するたびに、再帰が深くなり、毎回ViewControllerという新しいインスタンスが作成されるため、backclassは常に新しいインスタンスViewControllerを指します。

解決策は、より高いレベルでbackclassを作成することです。これは再帰呼び出しが発生したループの内側からfindmultiplebackclassを渡す意味するであろうことを

var backclass = ViewController() 
let foundJSON = json.findmultiple(backclass, predicate) 

注:あなたはこのようなアプローチを試してみてください。

+0

関数にパラメータを追加するにはどうすればよいですか?このようなもの? http://puu.sh/p34xv/0495baf411.png – johnson

+0

私は*これは次のようになります: 'func findmultiple(viewclass:ViewController、@noescape述語:JSON - > Bool) - > JSON? { ' – user212514

+0

私は完全な配列http://puu.sh/p39Ta/d26a1d9b8b.pngを持っていますが、コレクションビューを再読み込みしようとすると、' index out of range'というエラーでクラッシュし、 'importClass .count'私は0を取得しました。私はコレクションビューと同じクラスでそれを印刷しました。 – johnson

関連する問題