transportation the significado programming programación lenguaje language español descargar swift

swift - the - Compruebe si existe clave en el diccionario de tipo



swift(lenguaje de programación) (6)

¿Cómo puedo comprobar si existe una clave en un diccionario? Mi diccionario es de tipo [Type:Type?] .

No puedo simplemente revisar dictionary[key] == nil , ya que eso podría resultar de que el valor sea nil .

¿Algunas ideas?


Creo que indexForKey(key: Key) del tipo de diccionario es lo que está buscando. Devuelve el índice para una clave dada, pero lo más importante para sus propuestas, devuelve nulo si no puede encontrar la clave especificada en el diccionario.

if dictionary.indexForKey("someKey") != nil { // the key exists in the dictionary }

Sintaxis de Swift 3 ....

if dictionary.index(forKey: "someKey") == nil { print("the key ''someKey'' is NOT in the dictionary") }


En realidad, su dictionary[key] == nil prueba dictionary[key] == nil puede usarse para verificar si existe una clave en un diccionario. No producirá true si el valor se establece en nil :

let dict : [String : Int?] = ["a" : 1, "b" : nil] dict["a"] == nil // false, dict["a"] is .Some(.Some(1)) dict["b"] == nil // false !!, dict["b"] is .Some(.None) dict["c"] == nil // true, dict["c"] is .None

Para distinguir entre "la clave no está presente en dict" y "el valor de la clave es nula", puede realizar una asignación opcional anidada:

if let val = dict["key"] { if let x = val { println(x) } else { println("value is nil") } } else { println("key is not present in dict") }


Esto funciona para mí [Swift 3.0]:

let myVar = "c" let myDict: [String: Int] = ["a": 0, "b": 1, "c": 2] if myDict.keys.contains(myVar) { print(myVar) } else { print("ERROR") }


Lo manejé de esta manera en Swift 4:

extension Dictionary { func contains(key: Key) -> Bool { let value = self.contains { (k,_) -> Bool in key == k } return value } }

Esto usa Dictionary.contains(where: (key: Hashable, value: Value) throws -> Bool) . Al encapsularlo como una extensión, tengo una buena oportunidad de actualizar la implementación a algo mejor sin modificar mi código. index(forKey:Key) crear datos, lo que hace el index(forKey:Key) . Espero que sea más eficiente que acceder a las keys ya que debe crear toda la matriz antes de buscarla.


Prueba esto:

let value = dict[key] != nil

Espero que te funcione. Gracias


Siempre puedes hacer:

let arrayOfKeys = dictionary.allKeys if (arrayOfKeys.containsObject(yourKey)) { } else { }

Sin embargo, realmente me disgusta la idea de crear un NSDictionary que pueda contener opcionales.