2017-01-04 2 views
0

Ich versuche, ein int aus einem verschachtelten Wörterbuch zu greifen. Mein Code ist wieWarum gibt mein Wörterbuchartikel 0 zurück? Swift

convenience init(fromDict dict: [String:Any]) { 
    let dfs = dict["forms"] as? [[String :[String:Any]]] 
    self.init(
     atk: dfs?[0]["stats"]?["atk"] as? Int ?? 0, 
     def: dfs?[0]["stats"]?["def"] as? Int ?? 0, 
    ) 
} 

jedoch folgt, ist das Ergebnis Aufdrehen hält 0. ich sicher wissen, dass dies der richtige Dateipfad ist, also warum ist es nicht die richtige ganze Zahl angezeigt wird? Unten ist der Plistenweg, den ich ergreife. Jede Hilfe in dieser Angelegenheit wird sehr geschätzt.

<array> 
    <dict> 
    <key>forms</key> 
    <array> 
     <dict> 
      <key>stats</key> 
      <dict> 
       <key>atk</key> 
       <integer>49</integer> 
       <key>def</key> 
       <integer>49</integer> 
      </dict> 
     </dict> 
    </array> 
    </dict> 
<array/> 
+1

Verwenden Sie den Debugger und sehen Sie den Wert von 'dfs' und' dfs [0] 'und' dfs [0] ["stats "]', etc. – rmaddy

+0

Sie könnten auch ein 'print (dict)' in Ihrem init hinzufügen. Es sollte '[" Formen "drucken: [[" stats ": [" def ": 49," atk ": 49]]]]]. – vacawama

+0

"Formen": <__ NSCFArray 0x170266400> ( { Statistiken = { atk = 49; def = 49; }; – user4938361

Antwort

1

Sie sollten die optionale Verkettung nicht so missbrauchen. Sie bitten im Grunde um solche Fehler.

dfs ist nil weil Sie versuchen, es zu [[String :[String:Any]]] (a.k.a Array<Dictionary<String, <Dictionary<String, Any>>>) zu werfen, aber sein tatsächlichen Typ ist [String :[String:Any]] (auch bekannt als Dictionary<String, <Dictionary<String, Any>>).

Wenn Sie die richtige optionale Handhabung hätten, hätten Sie diesen Fehler sofort bemerkt.

convenience init(fromDict dict: [String:Any]) { 
    guard let let dfs = dict["forms"] as? [String :[String:Any]] else { 
     fatalError("Failed trying to cast dfs") 
    } 

    guard let stats = dfs["stats"] else { 
     fatalError("No value for \"stats\" key.") 
    } 

    guard let atk = stats["atk"] as? Int else { 
     fatalError("Missing or invalid value for \"atk\" key") 
    } 

    guard let def = stats["def"] as? Int else { 
     fatalError("Missing or invalid value for \"def\" key") 
    } 

    self.init(
     atk: atk, 
     def: def, 
    ) 
} 
+0

Sorry, ich habe den Beitrag aktualisiert. '[[String: [String: Any]]]' ist eigentlich korrekt, weil es ein Array von Wörterbüchern ist. Auch bekomme ich den ersten fatalen Fehler ** fehlgeschlagen versuchen, dfs ** zu werfen. Aber ich schaue auf die plist und verstehe nicht, warum es scheitern würde – user4938361

+0

In diesem Fall, wenn Sie die c ode, die ich zur Verfügung gestellt habe, hast du den Cast wieder in '[[String: [String: Any]]]' 'geändert? – Alexander

+0

Ja, ich habe es aktualisiert, um das richtige zu reflektieren. Der Fehler bleibt auf der ersten Wache bestehen – user4938361

0

So habe ich das Problem zu meiner Frage entdeckt. Ich lese aus mehreren Quelldateien gleichzeitig und einer von ihnen hatte kein "stats" Wörterbuch.

Ich dachte, ich hätte zwei Möglichkeiten: Um eine If-let-Anweisung zu erstellen, um nach "stats" zu überprüfen oder um zu kopieren, was ich von der Rogue-Quelldatei benötigte, und löschte sie insgesamt. Ich ging mit letzterem, da diese Quelldatei bekannt war, mir Probleme in der Vergangenheit zu geben

Verwandte Themen