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];

Sagar R. Kothari
fuente

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] ).

Matt B.
fuente
+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); 
hariszaman
fuente