Nil-Checks funktionieren nicht immer für Any in Swift

9

Ich bin verwirrt darüber, wie Swift nach nil sucht, wenn ich den Any-Typ verwende.
Hier ist ein Beispiel:

%Vor%

testA funktioniert wie erwartet. Die Variable ist null, daher ist die Bedingung falsch.

testB funktioniert nicht so wie erwartet. Die Variable ist null, wie der Druckaufruf zeigt. Die Bedingung testB != nil wird jedoch als wahr ausgewertet. Warum ist das der Fall?

testC verwirrt mich auch, da es testC = testB = testA ist. Warum sollte es sich anders verhalten als testA?

Wie müsste ich die Bedingungen if testB ... und if testC ... schreiben, um nicht wahr zu sein.
Ich suche nach einer Lösung, bei der ich den Typ nicht kennen muss, wie ...

%Vor%

Bearbeiten: Ich teste das mit Swift 4 in einer Xcode 9.1 Playground-Datei.

Bearbeiten2:
Einige Informationen über das eigentliche Problem, das ich lösen möchte. Ich bekomme ein Wörterbuch vom Typ [String: Any?] , das von einem JSON-Parser erstellt wird. Ich möchte überprüfen, ob der Wert für einen bestimmten Schlüssel Null ist, aber es funktioniert nicht, wenn der Schlüssel vorhanden ist und der Wert Optional (Null) ist.

Beispiel:

%Vor%     
florieger 06.01.2018, 14:25
quelle

1 Antwort

3

In Swift ist nil eigentlich ein konkreter Wert (vom Typ enum). testB , das vom Typ Any ist, enthält enum Optional mit dem Wert none und daher ist die Bedingung testB != nil wahr.

Dies löst das Rätsel, wie Any von testB den Nullwert halten kann.

Zu Ihrem eigentlichen Problem, habe ich diesen Code in Storyboard (Xcode 9.2) versucht und es hat wie erwartet funktioniert.

%Vor%

Für testB und testC scheint es so zu sein, dass == check mit nil eine Lösung liefert, aber weil der binäre Operand nicht mit zwei Any verwendet werden kann? Operanden können wir nicht ==.

verwenden

Die Verwendung von switch-case kann jedoch korrekte Ergebnisse liefern:

%Vor%

O / P :
Wert ist keiner
Wert ist keiner

    
Puneet Sharma 06.01.2018, 15:29
quelle

Tags und Links