Comprobar que la clave existe en NSDictionary

¿cómo puedo comprobar si esto existe ?:

[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"]

Quiero saber si esta clave existe o no. ¿Cómo puedo hacer eso?

Muchas gracias :)

EDITAR: dataArray tiene objetos en él. Y estos objetos son NSDictionaries.

preguntado el 08 de enero de 11 a las 17:01

Cualquier razón por la que estás usando -valueForKey: en lugar de -objectForKey:? El primero se utiliza en la codificación de valores clave y es un poco más lento que el segundo. -

9 Respuestas

Presumo que [dataArray objectAtIndex:indexPathSet.row] está devolviendo un NSDictionary, en cuyo caso puede simplemente comprobar el resultado de valueForKey en contra nil.

Por ejemplo:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // The key existed...

}
else {
    // No joy...

}

contestado el 18 de mayo de 19 a las 07:05

el valor de esa clave también puede ser nulo, por lo que este enfoque no probará completamente si existe una clave o no en el diccionario. Andrei A.

@ AndreiA.No puedes agregar nada a un NSDictionary. - John Parker

Sé que ya seleccionó una respuesta, pero me pareció bastante útil como categoría en NSDictionary. Empieza a entrar en eficiencia en este punto con todas estas diferentes respuestas. Meh ... 6 de 1 ...

- (BOOL)containsKey: (NSString *)key {
     BOOL retVal = 0;
     NSArray *allKeys = [self allKeys];
     retVal = [allKeys containsObject:key];
     return retVal;
}

Respondido 27 Oct 12, 02:10

También escribí el mismo método en mi categoría, pero tuve un bloqueo extraño cuando uso UIImageWriteToSavedPhotosAlbum (). después de reducir, cambio el nombre del método de containsKey => hasKey y el bloqueo desapareció - Kaala

Esto es mucho mejor que la respuesta aceptada. Quiero buscar por clave y no si el valor de la clave es nulo o no. Podría tener una clave en un diccionario que apunte a un valor nulo. Sin embargo, la clave existe. La respuesta aceptada no cubre este escenario. Pero esta solución aquí lo hace. - Houman

@Hooman: No es cierto acerca de una clave que tiene un valor de nil: el segundo párrafo de la documentación de NSDictionary (developer.apple.com/library/mac/documentation/Cocoa/Reference/…) establece que "Ni una clave ni un valor pueden ser nulos; si necesita representar un valor nulo en un diccionario, debe usar NSNull". Tanto esto como la respuesta aceptada funcionan para su escenario, es decir, con un diccionario donde un valor para alguna clave es nulo (de tipo NSNull). - Jarno Lamberg

O: return [[self allKeys] containsObject: key]? SÍ NO; - smileBot

buen rótulo, @Jamo. Me mantendría alejado de esta respuesta. Supongo que bajo las sábanas, tanto la llamada a allKeys como la llamada a containsObject son cada una al menos O (n), mientras que valueForKey es probablemente mucho menor. - orion elenzil

Compruebe si es nulo:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // SetEntries exists in this dict
} else {
    // No SetEntries in this dict
}

Respondido el 08 de enero de 11 a las 20:01

el valor de esa clave también puede ser nulo, por lo que este enfoque no probará completamente si existe una clave o no en el diccionario. Andrei A.

@AndreiA. Ni una clave ni un valor pueden ser nil en un NSDictionary. Para representar nil, puede usar NSNull. - Aaron Ash

esto también funciona usando literales Objective-C usando la siguiente sintaxis:

NSDictionary *dict = @{ @"key1" : @"value1", @"key2" : @"value2" };
if (dict[@"key2"])
NSLog(@"Exists");
else
NSLog(@"Does not exist");

Respondido el 14 de diciembre de 14 a las 14:12

Para la versión rápida, el siguiente código funciona. let headers: Dictionary = httpResponse .allHeaderFields if (headers ["errorcode"]! = nil) {print ("error key exist")} - Narasimha Nallamsetty

if ((NSNull *)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // SetEntries exists in this dict
} else {
    // No SetEntries in this dict
}

Esa es la respuesta correcta.

respondido 12 mar '14, 15:03

¿Para qué sirve el elenco de BOOL a NSNull *? - NiñoScript

Prueba esto:

if ([dict objectForKey:@"bla"]) {
   // use obj
} else {
   // Do something else like create the object
}

Respondido 21 Abr '14, 18:04

Esta puede ser una explicación técnicamente correcta, pero estará sirviendo mejor a la comunidad (y probablemente obtendrá más votos a favor) si proporciona una discusión más detallada sobre su razonamiento en el cuerpo de su respuesta. ¿Por qué es apropiado usar objectForKey: en lugar de otro método? ¿Por qué no tienes que comprobar explícitamente un valor? Como mínimo, usar el ejemplo de código proporcionado en la pregunta facilitaría vincular su ejemplo a la pregunta original. - Palpatim

Este hace lo mismo pero con menos código:

if (dataArray[indexPathSet.row][@"SetEntries"] != nil) { /* the key exists */        } 
else                                                   { /* the key doesn't exist */ }

Respondido 27 Oct 14, 22:10

El diccionario de verificación contiene cualquier valor. Prefiero [dic allKeys] .count> 0 para verificar.

Respondido 31 Oct 16, 05:10

Utiliza el (unsigned long) opción:

if ( (unsigned long)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] ) {
    // Key exist;
}else{
    // Key not exist;
};

Respondido el 04 de junio de 19 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.