2016-03-28 14 views
0

von einem Server ich einen JSON-String empfangen, dann versuche ich es auf ein NSDictionary auf diese Weise zu konvertieren:Komplizierte Zugriff auf Wörterbuch Schlüssel

let JSON = try NSJSONSerialization.JSONObjectWithData(rToData!, options:[]) 
guard let JSONDictionary:NSDictionary = (JSON as! NSDictionary) else { 
print("My grandma is way more NSDictionary than this") 
return 
} 

Nach der Konvertierung, ich versuche, einige Daten in dem Wörterbuch enthalten zu bekommen: insbesondere ich ein Array brauchen kann ich auf diese Weise zugreifen:

let myArray = JSONDictionary["data1"][0]["data2"]; 

XCode wirklich diese Idee nicht mag, bringt es einen Pfeil unter der ersten Klammer und sagt Wert des optionalen Typs „ANYOBJECT?“ nicht ausgepackt, meinst du "!" oder "?" ?. Ich seinen Vorschlag folgen, und ich fügen Sie ein, meine vorherigen Code zu dieser Umwandlung „!“:

let myArray = JSONDictionary["data1"]![0]["data2"]; 

An diesem Punkt die folgende Zeile (wo ich die Anzahl der Elemente in Daten2 zählen) zeigt einen Fehler, die besagt, AnyObject hat kein Mitglied count.

Das einzige, was diese Lösung gut zu funktionieren scheint, ist aber, abgesehen von hässlich und nicht lesbar zu sein, ich kann es wirklich nicht verstehen:

let myArray = (JSONDictionary["data1"]?[0]["data2"])!; 

Können Sie mir helfen, zu verstehen, warum diesen grundlegenden Zugriff auf einem Schlüssel in einem Wörterbuch muss so kompliziert sein?

Ich muss sagen, ich mag Swift, aber ich verbringe viel Zeit mit Optionen und bizarre XCode-Warnungen.

Antwort

2

Es gibt keine Garantie, dass Ihr JSON-Wörterbuch einen Wert für den Schlüssel data1 enthält (OK, Sie wissen es, aber Swift tut es nicht), also gibt JSONDictionary["data1"] ein optionales zurück. Sie müssen das optionale mit auspacken? oder !

Auch, da Sie ein NSDictionary, kein Swift-Wörterbuch haben, kennt Swift den Typ der Werte nicht, also sind sie AnyObject. Jetzt wissen Sie wieder, dass es sich um ein Array handelt, aber Swift tut das nicht, deshalb erhalten Sie einen Fehler, der besagt, dass AnyObject keine Methode count hat.

Während es ausführlicher ist, ist es sowohl für den Compiler als auch für jeden anderen, der Ihren Code betrachtet, klar, wenn Sie die Zeile in mehrere Zeilen aufteilen. Außerdem können Sie die verschiedenen Objekte abstürzen lassen, so dass Swift weiß, was vor sich geht, und mit einem fehlerhaften JSON umgehen.

if let array1 = JSONDictionary["data1"] as? NSArray { 
    if let dictionary1 = array1[0] as? NSDictionary { 
     if let data2Array = dictionary1["data2"] as? NSArray { 
      let count=data2Array.count 
     } 
    } 
} 

Sie könnten entsprechende else-Anweisungen implementieren Fehler zu behandeln

Optionals sind eine der Swift mächtigsten Funktionen. Sie helfen, eine ganze Familie von Fehlern zu vermeiden, die mit nicht initialisierten Variablen und speziellen Sentinnel-Werten für Randbedingungen verbunden sind. Es ist wichtig, dass Sie lernen, wie sie Ihnen helfen können und nicht nur werfen? oder ! bei Ihrem Code, bis es kompiliert.

+0

Zunächst einmal, vielen Dank für Ihre freundliche Antwort. Ich verstehe, dass sie mächtig sind und ich versuche mich mit ihnen vertrauter zu machen, aber wenn du keine Zeit hast und viel Druck um dich herum herrscht, blockieren sie wirklich sehr, so dass du die Probleme nach dem XCode leicht behebst Vorschläge. Ich weiß natürlich, dass das natürlich falsch ist –

Verwandte Themen