2016-09-30 3 views
-4

Ich habe den Inhalt einer JSON-Datei in einem Array von Wörterbüchern vom Typ [[String: AnyObject]] gespeichert. Ich möchte jedem Element im [String: AnyObject] -Wörterbuch ein neues Schlüssel/Wert-Paar hinzufügen. Ich erhalte immer wieder den Fehler: Kann nicht einem unveränderlichen Ausdruck vom Typ 'AnyObject ?!' zugewiesen werden Gibt es einen Weg dazu?Wie fügt man ein Schlüsselwertpaar zu einem Dictionary vom Typ [String: AnyObject] in Swift hinzu?

Probanden erklärt wurde, wie folgt:

var subjects = [[String:AnyObject]]() 

EDIT: Entschuldigt nicht code.So Posting, das ist eines der Elemente des [[String: ANYOBJECT]] array

{ "subjects" : { 
     "humanities" : [ 
      {"sno" : "TH5", "code" : 205, "name" : "Mathematics III", "credits" : 4} 
     ], 
     "applied" : [ 
      {"sno" : "TH3", "code" : 203, "name" : "Power Apparatus", "credits" : 4}, 
      {"sno" : "TH4", "code" : 204, "name" : "Electrical Measurements", "credits" : 4} 
     ], 
     "core" : [ 
      {"sno" : "TH1", "code" : 201, "name" : "Electronics I", "credits" : 4}, 
      {"sno" : "TH2", "code" : 202, "name" : "Circuits and Systems", "credits" : 4} 
     ], 
     "theory" : [ 
      {"sno" : "TH1", "code" : 201, "name" : "Electronics I", "credits" : 4, "category" : "C"}, 
      {"sno" : "TH2", "code" : 202, "name" : "Circuits and Systems", "credits" : 4, "category" : "C"}, 
      {"sno" : "TH3", "code" : 203, "name" : "Power Apparatus", "credits" : 4, "category" : "A"}, 
      {"sno" : "TH4", "code" : 204, "name" : "Electrical Measurements", "credits" : 4, "category" : "A"}, 
      {"sno" : "TH5", "code" : 205, "name" : "Mathematics III", "credits" : 4, "category" : "H"} 
     ], 
     "practical" : [ 
      {"sno" : "PR1", "code" : 206, "name" : "Electronics I", "credits" : 2}, 
      {"sno" : "PR2", "code" : 207, "name" : "Power Apparatus", "credits" : 2}, 
      {"sno" : "PR3", "code" : 208, "name" : "Electrical Measurements", "credits" : 2}, 
      {"sno" : "PR4", "code" : 209, "name" : "Machine Drawing", "credits" : 3}, 
      {"sno" : "VS1", "code" : 210, "name" : "Programming I", "credits" : 1} 
     ] 
    }, 
    "totalCredits" : 30, 
    "semester" : 3 
    } 

Acht solcher Wörterbücher sind in 'Themen' gespeichert. Ich möchte ein weiteres Schlüssel/Wert-Paar "marks" hinzufügen: 0 zu jedem Element in "humanities", "applied" und so weiter. Dies ist der Code, den ich verwende, zum Beispiel für „Geisteswissenschaften“

for i in 0..<self.subjects.count 
     { 
      for j in 0..<self.subjects[i]["humanities"]!.count 
      { 
       self.subjects[i]["humanities"]![j]["marks"] = 0 
      } 
     } 

Und das ist, wo ich den Fehler.

EDIT 2: hinzugefügt zusätzliche Erklärung

+0

Bitte fügen Sie Code, den Sie versuchen .. – Cool7

+0

Aufgrund der Wert Semantik müssen Sie das Wörterbuch als 'var', das Schlüssel/Wert-Paar hinzufügen und das Wörterbuch zurück zum Array zuweisen. – vadian

+0

@Prashant Ich habe den Code –

Antwort

0

Das Hauptproblem besteht darin, dass Sie keine Werte auf Wörterbücher in der gleichen zuweisen, was Sie in Arrays zu tun.

Wenn Sie die Werte in den Wörterbüchern, wie diese zugreifen:

var dictionaryValues = dictionary.values 

und dann die Werte in diesem Array ‚dictionaryValues‘ versuchen, zu ändern, die Sie versuchen, das Wörterbuch nicht richtig zu aktualisieren.

Die Art, wie Sie einen Eintrag in einem Wörterbuch ändern, besteht darin, den Wert entsprechend dem zugehörigen Schlüssel zuzuweisen.

So weiß ich, Sie die Taste (n) für die Werte, die Sie ändern möchten Sie die neuen Werte wie folgt zuordnen:

let key = "keyForValueYouWishToChange" 
let newValue: AnyObject = 1 

for (index, dictionary) in arrayOfDictionaries.enumerate() { 
    var mutableDictionary = dictionary 
    mutableDictionary[key] = newValue //this is how you assign to dictionaries 
    arrayOfDictionaries[index] = mutableDictionary 
} 

Auch Ihr Wörterbuch eher auf einen var ändern als ein let so dass es ist veränderbar

+0

Oh ja, dummer Fehler. Ich benutze Stack-Überlauf auf meinem Handy, wenn ich unterwegs bin, so kann manchmal schlampig sein –

0

Es ist schwer zu verstehen, was Sie wirklich tun wollen. Sie behalten keine Struktur wie [String : [String : [[String : Any]]]] im Speicher und ändern Sachen direkt in das, das ist wahrscheinlich, warum Sie diesen Fehler bekommen. Sie müssen aus dieser Struktur "extrahieren" und damit arbeiten. Wenn Sie es wieder in JSON wollen, müssen Sie es erneut serialisieren, umgekehrt. Um Ihnen einen Start, ich werde Ihnen zeigen, wie ein einziges Thema aus Ihrem JSON zu bekommen:

// Mockup String 
let jsonString = "{ \"subjects\" : { \"humanities\" : [ {\"sno\" : \"TH5\", \"code\" : 205, \"name\" :  \"Mathematics III\", \"credits\" : 4} ], \"applied\" : [ {\"sno\" : \"TH3\", \"code\" : 203, \"name\" : \"Power  Apparatus\", \"credits\" : 4}, {\"sno\" : \"TH4\", \"code\" : 204, \"name\" : \"Electrical Measurements\",  \"credits\" : 4} ], \"core\" : [ {\"sno\" : \"TH1\", \"code\" : 201, \"name\" : \"Electronics I\", \"credits\" :  4}, {\"sno\" : \"TH2\", \"code\" : 202, \"name\" : \"Circuits and Systems\", \"credits\" : 4} ], \"theory\" : [  {\"sno\" : \"TH1\", \"code\" : 201, \"name\" : \"Electronics I\", \"credits\" : 4, \"category\" : \"C\"},  {\"sno\" : \"TH2\", \"code\" : 202, \"name\" : \"Circuits and Systems\", \"credits\" : 4, \"category\" : \"C\"},  {\"sno\" : \"TH3\", \"code\" : 203, \"name\" : \"Power Apparatus\", \"credits\" : 4, \"category\" : \"A\"},  {\"sno\" : \"TH4\", \"code\" : 204, \"name\" : \"Electrical Measurements\", \"credits\" : 4, \"category\" :  \"A\"}, {\"sno\" : \"TH5\", \"code\" : 205, \"name\" : \"Mathematics III\", \"credits\" : 4, \"category\" :  \"H\"} ], \"practical\" : [ {\"sno\" : \"PR1\", \"code\" : 206, \"name\" : \"Electronics I\", \"credits\" : 2},  {\"sno\" : \"PR2\", \"code\" : 207, \"name\" : \"Power Apparatus\", \"credits\" : 2}, {\"sno\" : \"PR3\",  \"code\" : 208, \"name\" : \"Electrical Measurements\", \"credits\" : 2}, {\"sno\" : \"PR4\", \"code\" : 209,  \"name\" : \"Machine Drawing\", \"credits\" : 3}, {\"sno\" : \"VS1\", \"code\" : 210, \"name\" : \"Programming  I\", \"credits\" : 1} ] }, \"totalCredits\" : 30, \"semester\" : 3 }" 

// use a function to directly retrieve a single subject 
func getSubject(subject: String) -> [String: Any]? { 

    // use some guards to keep the nesting depth minimal 

    // read the json string 
    let data = jsonString.data(using: .utf8) 
    guard data != nil else { 
     return nil 
    } 

    // try to parse the json 
    let parsedJson = try? JSONSerialization.jsonObject(with: data!) as? [String: Any] 
    guard parsedJson != nil else { 
     return nil 
    } 

    // read the subjects 
    if let jsonDictionary = parsedJson! { 
     let subjects = jsonDictionary["subjects"] as? [String: Any] 
     guard subjects != nil else { 
      return nil 
     } 

     // get a single subject and interpret it as array 
     if let singleSubject = subjects![subject] as? [Any] { 
      // check if it contains elements 
      if singleSubject.count > 0 { 
       // return the first (and only) entry as dictionary 
       return singleSubject[0] as? [String: Any] 
      } 
     } 
    } 

    return nil 
} 

if var humanities = getSubject(subject: "humanities") { 

    // add a new entry 
    humanities["marks"] = 0 

    // print out all entries to check 
    for (key, value) in humanities { 
     print("\(key): \(value)") 
    } 
} 

druckt:

name: Mathematics III 
marks: 0 
sno: TH5 
code: 205 
credits: 4 
+0

Ich speicherte die gesamten Daten in einer Let-Konstante. Ich habe die einzelnen Elemente des Wörterverzeichnis-Arrays in einer Variablen gespeichert, die am Anfang der Klasse deklariert ist. –

Verwandte Themen