2016-03-30 6 views
1

Ich analysiere JSON und hänge die Daten an ein Array an, und während das Array die richtige Anzahl von Elementen enthält, ist es immer und immer das gleiche Element Zuletzt hinzugefügt wurde. Hier ist der Code ich verwende:Array enthält nur den letzten Wert, aber die Anzahl ist immer noch gleich

if (statusCode == 200) { 
    do{ 
     let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
     if let ns = json as? NSArray{ 
     for ns in ns{ 
      if let name = ns["name"] as? String{ 
      if let number = ns["number"] as? Int{ 
       if let cn = ns["cyclenumber"] as? Int{ 
       if let url = ns["url"] as? String{ 
        self.c.name = name 
        self.c.number = number 
        self.c.cycleNumber = cn 
        self.c.url = url 
        self.n.array.append(self.c) 
       } 
       } 
      } 
      } 
     } 
     } 

    }catch { 
     print("Error with Json: \(error)") 
    } 

} 

Wenn ich das Array drucken, druckt es nur jedoch viele Elemente wurden hinzugefügt, aber sie sind alle Duplikate des letzten Elements hinzugefügt.

+5

Heilige Pyramide des Schicksals batman ... – PeejWeej

+0

Does 'für ns in ns' Kompilierung alle an? – vadian

+0

Ich denke, es wird funktionieren, aber Sie werden nicht in der Lage sein, auf das Array namens ns zugreifen und ist daher sehr schlecht und ziemlich verwirrend. (So ​​ist mit 1 oder 2 Buchstaben Namen, aber das ist ein anderes Problem.) – PeejWeej

Antwort

1

Das Problem ist, dass Sie die gesunde Instanz anfügen - nämlich self.c. Da der Typ c ein class, nicht struct ist, wird nicht kopiert; Derselbe Verweis wird dem Array immer wieder hinzugefügt.

Sie können dieses Problem beheben, indem c machen ‚s Art ein struct oder durch einen neuen c der Schleife bei jeder Iteration zuweisen:

if let url = ns["url"] as? String { 
    var c = TypeOfC() // Make a new instance 
    c.name = name 
    c.number = number 
    c.cycleNumber = cn 
    c.url = url 
    self.n.array.append(c) 
} 

Beachten Sie, dass c nicht länger ein Mitglied von self. Da Sie c innerhalb einer Schleife ändern, war es sehr wahrscheinlich ein Fehler an erster Stelle, es zu einem Mitglied zu machen.

+0

Arbeitete perfekt, danke für die schnelle Antwort! – chrisz

1

die Antwort bereits gegeben worden, aber ich dachte, dass ich Ihren Code ein wenig aufzuräumen sollte :)

guard let data = data where statusCode == 200 else { 
    return 
} 

do{ 
    let json = try NSJSONSerialization.JSONObjectWithData(data, options:.AllowFragments) 

    if let ns = json as? NSArray{ 
     for ns in ns{ 
      if let name = ns["name"] as? String, number = ns["number"] as? Int, 
       cn = ns["cyclenumber"] as? Int, url = ns["url"] as? String{ 

        self.c.name = name 
        self.c.number = number 
        self.c.cycleNumber = cn 
        self.c.url = url 
        self.n.array.append(self.c) 
       } 
      } 
     } 

}catch { 
    print("Error with Json: \(error)") 
} 
+0

Danke! Neuere zu Swift, schätze die Hilfe. – chrisz

+0

kein Problem. Viel Glück beim Lernen! – PeejWeej

Verwandte Themen