2016-04-01 4 views
0

Ich habe dem Alamofire-Paket in meinem Projekt einige zusätzliche Funktionen hinzugefügt, und aus irgendeinem Grund geht es bei dieser optionalen Bindung in die If-Anweisung, ob der "error" -Schlüssel im json existiert oder nicht . Irgendwelche Ideen, was ich falsch mache?Optionale Swift-Bindung, die immer noch Nulldaten enthält

let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options) 

if let error = JSON["error"] { 
    print(error!) 
    return .ServerError(error as! String) 
} 

Wenn kein Fehler der Druck mit einem Ausfall „fatalen Fehler: unerwartet gefunden Null, während ein optionaler Wert auspackt“

Antwort

2

Sie versuchen as? String Hinzufügen könnte, welche die optionale unwrap helfen würde und nicht in der Flucht if-Anweisung, wenn die Zeichenfolge nicht da ist:

let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options) 

if let error = JSON["error"] as? String { 
    print(error) 
    return .ServerError(error) 
} 
+1

Die Kraft unwrap unnötig zu werfen ist. Selbst wenn 'JSON' optional ist, befinden wir uns bereits in' if let', also warum sollten wir unwrap erzwingen? – nhgrif

+0

Wahr! Aber der erste Teil ist immer noch richtig –

+0

Dies funktioniert am besten gegeben, was ich tue, wird nicht fehlschlagen, wenn JSON ein JSON-Array enthält, macht Sinn zu versuchen, zu einer Zeichenfolge auszupacken. Danke! – beerye

2

das Problem ist, dass JSONObjectWithData kehrt AnyObject.
Sie haben die Art zu etwas Geeignetes zu erhalten zuverlässige Ergebnisse in diesem Fall ein Dictionary

do { 
    let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options) as! [String:AnyObject] 

    if let error = JSON["error"] as? String { 
     print(error) 
     return .ServerError(error) 
    } 
} 
catch let error as NSError { 
    print(error) 
} 
+0

Wahrscheinlich * etwas * in dem Fall, dass 'JSON [" error "]' kann nicht als ein 'String' anstelle eines stillen Fehlers ausgepackt werden, aber +1 in beide Richtungen. – nhgrif

+0

Yeap dies tut den Trick, aber ich habe vergessen zu erwähnen, dass, wenn es keinen Fehler gibt es nicht immer ein Wörterbuch von [String: AnyObject]. Ich habe JSON-Arrays manchmal gesendet und diese Methode scheitert an der – beerye

+0

Wenn Sie den Fehler auf diese Weise abrufen und überprüfen möchten, muss das JSON-Objekt ein Wörterbuch sein, andernfalls verlassen JSON als "AnyObject" und überprüfen Sie den Typ direkt danach die Deserialisierung. – vadian

Verwandte Themen