NSDictionary: es necesario verificar si el diccionario contiene un par clave-valor o no


96

Solo necesito preguntar algo como sigue. Supongamos que tengo un diccionario.

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
[xyz setValue:@"sagar" forKey:@"s"];
[xyz setValue:@"amit" forKey:@"a"];
[xyz setValue:@"nirav" forKey:@"n"];
[xyz setValue:@"abhishek" forKey:@"a"];
[xyz setValue:@"xrox" forKey:@"x"];

Ahora, necesito verificar lo siguiente

[¿xyz contiene el valor de la clave "b"? par o no?

La pregunta es ¿Cómo?

La otra pregunta es ¿Cómo contar el par clave-valor total?

Decir por ejemplo NSInteger mCount=[xyz keyCounts];

Respuestas:


193

Pregúntele por el objectForKey:@"b". Si regresa nil, no se establece ningún objeto en esa clave.

if ([xyz objectForKey:@"b"]) {
    NSLog(@"There's an object set for key @\"b\"!");
} else {
    NSLog(@"No object set for key @\"b\"");
}

Editar : En cuanto a su segunda pregunta editada, es simplemente NSUInteger mCount = [xyz count];. Ambas respuestas están bien documentadas y se encuentran fácilmente en la referencia de clase NSDictionary ( [1] [2] ).


+1 De hecho, la documentación directamente dice esto: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong

6
¿Qué pasa si la clave está presente en el diccionario y su valor es 0? ¿No pensaríamos erróneamente que la clave no está presente en el diccionario?
jbx72487

13
@ jbx72487 Los diccionarios deben contener objetos; objectForKey:devuelve un id- un puntero a un objeto Objective-C. Si está almacenando números, deben estar "encasillados" en un NSNumber . Incluso si NSNumber es cero o falso, seguirá siendo un puntero válido y el código anterior detectará con precisión la existencia.
Matt B.

no funciona conmigo, devuelve lo siguiente: Finalizando la aplicación debido a una excepción no detectada 'NSInvalidArgumentException', motivo: '- [__ NSSingleObjectArrayI objectForKey:]: selector no reconocido enviado a la instancia 0x60000133a1c0'
Amr Angry

2

Con la sintaxis literal, puede verificar lo siguiente

static const NSString* kKeyToCheck = @"yourKey"
if (xyz[kKeyToCheck])
  NSLog(@"Key: %@, has Value: %@", kKeyToCheck, xyz[kKeyToCheck]);
else
 NSLog(@"Key pair do not exits for key: %@", kKeyToCheck); 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.