Actualmente estoy usando los siguientes fragmentos de código (torpes) para determinar si un diccionario Swift (no vacío) contiene una clave determinada y para obtener un (cualquier) valor del mismo diccionario.
¿Cómo se puede poner esto más elegantemente en Swift?
// excerpt from method that determines if dict contains key
if let _ = dict[key] {
return true
}
else {
return false
}
// excerpt from method that obtains first value from dict
for (_, value) in dict {
return value
}
swift
dictionary
Drux
fuente
fuente
indexForKey
si cree que es más claro y más explícito; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
El?? ""
aquí significa básicamente "si no hay tal clave, devuelve un espacio en blanco".Respuestas:
No necesita ningún código especial para hacer esto, porque es lo que un diccionario ya hace. Cuando busca
dict[key]
, sabe si el diccionario contiene la clave, porque el Opcional que obtiene no lo estánil
(y contiene el valor).Entonces, si solo desea responder la pregunta de si el diccionario contiene la clave, pregunte:
Si desea el valor y sabe que el diccionario contiene la clave, diga:
Pero si, como suele suceder, no sabe que contiene la clave, desea obtenerla y usarla, pero solo si existe, use algo como
if let
:fuente
dict.values
.dict.values
es opaco. Puedes recorrerlo pero eso es todo. (Está bien, no es todo, pero hágame caso.) Si quiere que se reified a una matriz, tomedict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
es opcional, como siempre ha sido.¿Por qué no simplemente verificar
dict.keys.contains(key)
? La comprobación dedict[key] != nil
no funcionará en los casos en que el valor sea nulo. Como con un diccionario[String: String?]
por ejemplo.fuente
if let val = dict[key]
, puede usarif let val = dict[key] as? String
en este caso.dict.keys
que crea una matriz con todas las claves, luego (2) verifica cada clave en orden hasta que encuentre una (¡o ninguna!). Soy consciente de que está tratando de abordar el caso de una[String: String?]
necesaria, pero será mucho cuidado con esa solución ...La respuesta aceptada
let keyExists = dict[key] != nil
no funcionará si el Diccionario contiene la clave pero tiene un valor nulo.Si desea asegurarse de que el Diccionario no contiene la clave, use esto (probado en Swift 4).
fuente
== nil
funciona, incluso si el diccionario tiene valores opcionales. Esto se debe a que el resultado de la búsqueda se ajusta como unOptional
. Por otro lado, para verificar si el valor buscado es realmentenil
más que ausente, puede usarlo== .some(nil)
.O(1)
. Ver también: github.com/apple/swift-evolution/blob/master/proposals/… ¿Qué te hizo pensar que eraO(n)
?Dictionary.Keys.contains(...)
función aquí dice que tieneO(n)
complejidad, donden
está la longitud de la secuencia.Parece que obtuvo lo que necesita de @matt, pero si desea una forma rápida de obtener un valor para una clave, o simplemente el primer valor si esa clave no existe:
Tenga en cuenta que no garantiza lo que realmente obtendrá como primer valor, simplemente sucede que en este caso devuelve "rojo".
fuente
??
operador me arrebató mi solución de conveniencia, pero como extensión ese valor predeterminado podría presentar inseguridades en los datos o comportamientos inesperados. Eso suena como algo que una subclase concretaDictionary
debería emplear. ¿Con qué frecuencia necesita el primer valor en caso de unnil
retorno excluyendo la funcionalidad específica de la situación?fuente
Mi solución para una implementación de caché que almacena NSAttributedString opcional:
fuente
Esto es lo que funciona para mí en Swift 3
fuente