2017-06-28 2 views
0
if let action = self.info?["action"] { 
    switch action as! String { 
     .... 
    } 
} else {...} 

Dans cet exemple, "action" existe toujours en tant que clé dans self.info.Swift: Unemballage des options et NSNull

Une fois que la deuxième ligne exécute, je reçois:

Could not cast value of type 'NSNull' (0x1b7f59128) to 'NSString' (0x1b7f8ae8). 

Toute idée de comment l'action peut être même si je NSNull déballa? J'ai même essayé "if action! = Nil", mais il se faufile encore et cause un SIGABRT.

+0

Il pourrait être possible que ce que vous essayez de déballer n'est pas un String – Slayter

+0

self.info est un dictionnaire de type [String: AnyObject], mais la valeur est toujours une chaîne. Ne devrait pas forcer le travail abattu indépendamment? – nuvaryan

+0

Pourquoi ne lancez-vous pas une action conditionnelle à une chaîne lorsque vous la déclarez? Comme ceci: 'si let action = self.info?["action"] as? String {... ' –

Répondre

1

NSNull est une valeur spéciale résultant généralement du traitement JSON. C'est très différent d'une valeur nil. Et vous ne pouvez pas forcer un objet d'un type à un autre, c'est pourquoi votre code échoue.

Vous avez quelques options. En voici un:

let action = self.info?["action"] // An optional 
if let action = action as? String { 
    // You have your String, process as needed 
} else if let action = action as? NSNull { 
    // It was "null", process as needed 
} else { 
    // It is something else, possible nil, process as needed 
} 
+0

Merci, cela a fonctionné! – nuvaryan

0

Essayez-le. Ainsi, dans la première ligne, vérifiez d'abord s'il y a une valeur valide pour « action », alors si cette valeur est dans le type String

if let action = self.info?["action"] as? String { 
    switch action{ 
     .... 
    } 
} else {...} 
0
if let action = self.info?["action"] { // Unwrap optional 

    if action is String { //Check String 

     switch action { 
     .... 
     } 

    } else if action is NSNull { // Check Null 

    print("action is NSNull") 

    } else { 

    print("Action is neither a string nor NSNUll") 

    } 

} else { 

    print("Action is nil") 

}