Necesito verificar si un dict tiene una clave o no. ¿Cómo?
objective-c
foundation
dontWatchMyProfile
fuente
fuente
NSDictionary
contiene cualquier tecla (no específica) se debe utilizar[dictionary allKeys].count == 0
si elcount
es0
que no hay llaves en elNSDictionary
.Respuestas:
objectForKey
devolverá nil si no existe una clave.fuente
[NSNull null]
en su lugar.o
fuente
Las versiones más recientes de Objective-C y Clang tienen una sintaxis moderna para esto:
No es necesario verificar la igualdad con nulo, porque solo los objetos Objective-C no nulos pueden almacenarse en diccionarios (o matrices). Y todos los objetos Objective-C son valores verdaderos. Incluso
@NO
,@0
y[NSNull null]
evaluar como verdadero.Editar: Swift ahora es una cosa.
Para Swift, probarías algo como lo siguiente
Esta sintaxis solo ejecutará el bloque if si myKey está en el dict y si lo está, entonces el valor se almacena en la variable de valor. Tenga en cuenta que esto funciona incluso para valores falsey como 0.
fuente
fuente
Al usar diccionarios JSON:
fuente
Me gusta la respuesta de Fernandes aunque pidas el obj dos veces.
Esto también debería hacer (más o menos lo mismo que Martin's A).
Martin y esta respuesta funcionan en iPad2 iOS 5.0.1 9A405
fuente
Un problema muy desagradable que acaba de perder un poco de mi tiempo de depuración: es posible que el autocompletado te pida que intentes usar lo
doesContain
que parece funcionar.Excepto,
doesContain
utiliza una comparación de id en lugar de la comparación de hash utilizada porobjectForKey
lo que si tiene un diccionario con teclas de cadena, devolverá NO a adoesContain
.fuente
Usando Swift, sería:
fuente
Si. Este tipo de errores son muy comunes y conducen al bloqueo de la aplicación. Entonces uso para agregar NSDictionary en cada proyecto de la siguiente manera:
//.h código de archivo:
//.m el código del archivo es el siguiente
En el código puede usar lo siguiente:
fuente
Para verificar la existencia de la clave en NSDictionary:
fuente
Debido a que nil no se puede almacenar en las estructuras de datos de Foundation, a
NSNull
veces se representa unnil
. Debido a queNSNull
es un objeto singleton, puede verificar siNSNull
es el valor almacenado en el diccionario mediante la comparación de puntero directo:fuente
NSNull
instancia de singleton se ha almacenado en el diccionario como el valor de la clave@"myKey"
. Eso es algo totalmente diferente a que la clave@"myKey"
no esté en el diccionario; de hecho, los dos son mutuamente excluyentes.Solución para swift 4.2
Entonces, si solo quiere responder a 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 buscarla y usarla, pero solo si existe, use algo como
if let
:fuente
Le sugiero que almacene el resultado de la búsqueda en una variable temporal, pruebe si la variable temporal es nula y luego úsela. De esa manera no miras el mismo objeto dos veces:
fuente
Como Adirael sugirió
objectForKey
verificar la existencia de la clave, pero cuando llamasobjectForKey
al diccionario anulable, la aplicación se bloquea, así que lo solucioné de la siguiente manera.}
fuente
fuente