2016-07-21 7 views
0

taker ist ein Wörterbuch. Wenn ich taker["user_id"] für Null-Wert überprüfe. Es sagt, es ist nicht Null. Aber wenn ich es auspacke, enthält es tatsächlich Nullwert. Hier ist meine Debugger-Ausgabe. Wie ist das möglich?Swift optional Nullprüfung gibt ein anderes Ergebnis zurück als der aktuelle Fall

Debugger output

+0

Wenn Ihr Wörterbuch wie ist 'lassen Wörterbuch: [String: ANYOBJECT] = [“ id ": NSNull()]' then 'dictionary [" id "] = Optional ()' aber wenn du nach nil i suchst, wird e als non nil value zurückgegeben. – Khundragpan

Antwort

2

po taker["user_id"] gibt Ihnen die richtige Antwort: Some: <null> bedeutet, dass, was innerhalb des Nullable-Wert ist null. Selbst ohne Foundation-Interop könnten Sie etwas Ähnliches mit einem Wörterbuch mit optionalen Werten erhalten (wie [Int: Int?], in welchem ​​Fall der Ergebnistyp des Indexes Int?? wäre).

In Ihrem Fall ist es jedoch "nur", dass das Objekt im optionalen eine Instanz von NSNull() ist. ist ein spezieller Typ, den Sie an Orten verwenden, wo nil nicht akzeptabel wäre. Zum Beispiel unterstützen Objective-C NSDictionaries keine nil Werte (da sie nil für Schlüssel zurückgeben, die im Wörterbuch nicht vorhanden sind). Wenn Sie signalisieren möchten, dass ein Schlüssel NSDictionary existiert, aber keinen Wert hat, ist es am üblichsten, ihn mit einem Wert von zu verknüpfen.

Ich vermute, dass taker ist ein Wörterbuch von JSON abgeleitet. Sie sollten überprüfen, dass der Wert neben dem vorhandenen Schlüssel den von Ihnen erwarteten Typ aufweist. Dies wird s und möglicherweise andere falsche Eingaben aussortiert. Zum Beispiel:

if let value = taker["user_id"] as? Int { 
    // things here 
} 
1

Dies ist der Fall

Sie Wörterbuch enthält sein kann NSNull() als Wert

let dictionary: [String: AnyObject] = ["id": NSNull()] 

if dictionary["id"] == nil { 
    print("is Nil") 
}else { 
    print("Not Nil") // prints: Not Nil as this is true 
} 

print(dictionary["id"]) // Optional(<null>) 
Verwandte Themen