2017-10-15 3 views
1

J'ai remarqué un comportement que je trouve confus lors de la vérification si une valeur dans un dictionnaire est une valeur nulle. Dans le gestionnaire de notification pour une certaine notification, je veux vérifier si la valeur de la clé d'erreur est nulle. Tout en essayant de déboguer ce que j'ai essayé les éléments suivants:Résultats de vérification nil inattendus pour la valeur optionnelle dans le dictionnaire

po userInfo [ "erreur"]

▿ En option - certains: néant

(LLDB) po userInfo [ "erreur"] == nul

faux

Compte tenu de la sortie pour la première commande, je m'y attendais le second pour revenir vrai. Une idée?

Merci

+0

Je pense que ce n'est pas nul. Mais pour confirmer, pourriez-vous vérifier quelle est la sortie de 'po userInfo [" erreur "]!'. (forcer le déballage) – Tushar

Répondre

0

Je pense que je l'ai trouvé le coupable. Je créais le dictionnaire comme suit:

let userInfo = [DatabaseRestaurantNotificationPayload.infoDictionaryErrorKe‌​y:nil, DatabaseRestaurantNotificationPayload.infoDictionaryRestaura‌​ntKey:value1] as [String : Any]

et contrairement à ce que l'on pourrait attendre à cela finit par ajouter en fait une option pour la clé d'erreur, de sorte que l'interrogation du dictionnaire pour le retour errorKey en option (néant) plutôt que nul même.

0

Vous savez que n'importe qui peut contenir quoi que ce soit, non? Il peut également contenir un optionnel. Et il peut contenir un optionnel qui est nul.

Il semble que ce soit ce qui se passe ici. userInfo ["erreur"] n'est pas nul, il contient un optionnel avec une valeur de zéro. Ce n'est pas la même chose. Je vérifierais comment vous avez créé cet userInfo.

2

userInfo["error"] donne Optional<Sometype>.some(Optional<SomeOtherType>.none). Donc, le userInfo dictionnaire a une valeur pour la clé "error", mais cette valeur est une autre facultative, qui est elle-même nil.

Voici un extrait de code qui imite la structure:

let userInfo: [String: String?] = [ 
    "something": "something else", 
    "another thing": "yet another thing", 
    "error": nil 
] 

print(userInfo["error"] as Any) // Optional(nil) 
+0

Hey Alex, est-ce que tu dois le projeter comme Any quand tu l'imprimes? Je suppose qu'il devrait être «nul» par défaut. –

+0

@AhmadF Ce n'est pas nécessaire, mais le compilateur Swift vous avertit lorsque vous essayez de forcer 'Any?' Dans 'Any', ce qui est généralement une odeur de code. De quoi parles-tu? – Alexander

+0

Je veux dire sans avoir besoin de le lancer à 'Any' le résultat devrait être" Optional (nil) ", mais comme vous l'avez mentionné, le compilateur tirera un avertissement ... –