Cómo verificar si NSDictionary no es nil en Swift 2

Estoy recibiendo NSDictionary como parámetro en mi function, pero tengo un problema porque no sé cómo verificar si ese parámetro no es nulo.

Mi function se ve así:

func doSmth(val : NSDictionary) 

Dentro de mi function estoy tratando de get algunos valores:

 let action = val["action"] as! String 

Pero get error "error fatal: inesperadamente encontrado nil mientras desenvuelve un valor opcional" cuando recibe el parámetro val como nil.

Solutions Collecting From Web of "Cómo verificar si NSDictionary no es nil en Swift 2"

El error se debe a suponer (casting de fuerza) un valor que a veces puede ser nulo. Swift es increíble, porque permite desenvolvimientos condicionales y versiones condicionales en declaraciones muy concisas. Recomiendo lo siguiente (para Swift 1-3):

Use "if let" para verificar condicionalmente "acción" en el dictionary.

¿Usar como? para emitir condicionalmente el valor a una cadena

 if let actionString = val["action"] as? String { // action is not nil, is a String type, and is now stonetworking in actionString } else { // action was either nil, or not a String type } 

También puede acceder a la allKeys o, alternativamente, allValues y comprobar si la matriz contiene elementos como este:

 let dic = NSDictionary() let total = dic.allKeys.count if total > 0 { // Something's in there } else { // Nothing in there } 

EDITAR

Aquí es cómo se puede detectar si el NSDictionary es nulo, si la key que está buscando existe, y si intenta acceder a su valor:

 let yourKey = "yourKey" if let dic = response.someDictionary as? NSDictionary { // We've got a live one. NSDictionary is valid. // Check the existence of key - OR check dic.allKeys.containsObject(yourKey). let keyExists: Bool = false; for var key as String in dic.allKeys { if key == yourKey { keyExists = true; } } // If yourKey exists, access it's possible value. if keyExists == true { // Access your value if let value = dic[yourKey] as? AnyObject { // We're in business. We have the value! } else { // yourKey does not contain a value. } } else { // yourKey does not exist in NSDictionary. } } else { // Call an ambulance. NSDictionary is nil. } 

Eso no está particularmente relacionado con Swift 2.

Si el dictionary no puede ser declarado como opcional

 func doSmth(val : NSDictionary?) 

Luego usa enlaces opcionales para verificar

 if let valIsNonOptional = val { let action = valIsNonOptional["action"] as! String } 

El código asume que hay una action key action contiene un valor de String todos modos si el dictionary no es nulo

El parámetro del dictionary probablemente no sea nulo. Probablemente el problema sea que su dictionary no contiene un valor para la "action" key.

Cuando dices val["action"] , el dictionary (siendo un NSDictionary ) devuelve un Optional<AnyObject> . Si val contiene la key "action" , devuelve Some(value) . Si val no contiene la key "action" , devuelve None , que es igual a cero.

Puede desenvolver el Optional en su reparto y elegir un curso de acción basado en si fue nulo, utilizando una statement if-let :

 if let action = val["action"] as? String { // action is a String, not an Optional<String> } else { // The dictionary doesn't contain the key "action", and // action isn't declanetworking in this scope. } 

Si realmente crees que val podría ser nula, debes declarar tu function de esa manera, y puedes desenvolver val sin renombrarlo usando una statement de guard algo confusa:

 func doSmth(val: NSDictionary?) { guard let val = val else { // If val vas passed in as nil, I get here. return } // val is now an NSDictionary, not an Optional<NSDictionary>. ... }