2011-01-08 21 views
69

cómo puedo comprobar si este existe ?:clave Fecha de NSDictionary

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

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

Muchas gracias :)

EDIT: dataArray tiene objetos en ella. Y estos objetos son NSDictionaries.

+0

¿Por qué estás usando '-valueForKey:' en lugar de '-objectForKey:'? El primero se utiliza en la codificación de clave-valor y es un poco más lento que el último. –

Respuesta

149

supongo que [dataArray objectAtIndex:indexPathSet.row] devuelve un NSDictionary, en cuyo caso sólo tiene que comprobar el resultado de valueForKey contra nula.

Por ejemplo:

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

} 
else { 
    // No joy... 

} 
34

Comprobar si es nula:

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

así que sé ya ha seleccionado una respuesta, pero me pareció que esto es bastante útil como una categoría en NSDictionary. Empiezas a obtener eficiencia en este punto con todas estas respuestas diferentes. Meh ... 6 1 ...

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

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

+0

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

+3

@Hooman: no es verdadero sobre una clave que tiene un valor nulo: el segundo párrafo de la documentación NSDictionary (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference /Reference.html) establece que "Ni una clave ni un valor pueden ser nulos; si necesita representar un valor nulo en un diccionario, debe usar NSNull". Tanto esta como la respuesta aceptada funcionan para su escenario, es decir, con un diccionario donde el valor de alguna clave es nulo (de tipo NSNull). –

0
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.

+0

¿Cuál es el elenco de BOOL a NSNull *? –

0

Prueba esto:

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

Esta puede ser una explicación técnicamente correcta, pero estará sirviendo mejor a la comunidad (y probablemente obtenga más votos ascendentes) si brinda 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 buscar explícitamente un valor? Por lo menos, usar el ejemplo de código provisto en la pregunta facilitaría relacionar su ejemplo con la pregunta original. – Palpatim

0

Ésta hace lo mismo pero con menos código:

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

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

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

Para una versión rápida debajo del código funciona. dejar que los encabezados: Diccionario = HTTPResponse .allHeaderFields si (cabeceras [ "código de error"] = nil!) {("la clave existe error") de impresión } –

0

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