NSDictionary - É necessário verificar se o dicionário contém um par de valores-chave ou não

96

Eu só preciso perguntar algo como a seguir. Suponha que eu tenha um dicionário.

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

Agora, preciso verificar o seguinte

[xyz contém o valor da chave "b" ?? par ou não?

A pergunta é como?

A outra questão é como contar apenas o par de valores-chave total?

Diga por exemplo NSInteger mCount=[xyz keyCounts];

Sagar R. Kothari
fonte

Respostas:

193

Basta pedir o objectForKey:@"b". Se retornar nil, nenhum objeto está definido nessa chave.

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

Edit : Quanto à sua segunda pergunta editada, é simplesmente NSUInteger mCount = [xyz count];. Ambas as respostas estão bem documentadas e facilmente encontradas na referência de classe NSDictionary ( [1] [2] ).

Matt B.
fonte
+1 Na verdade, a documentação diz o seguinte: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong
6
E se a chave estiver presente no dicionário e seu valor for 0? Não pensaríamos erroneamente que a chave não está presente no dicionário?
jbx72487 01 de
13
@ jbx72487 Os dicionários devem conter objetos; objectForKey:retorna um id- um ponteiro para um objeto Objective-C. Se você estiver armazenando números, eles devem ser "encaixotados" em um NSNumber . Mesmo que o NSNumber seja zero ou falso, ele ainda será um ponteiro válido e o código acima detectará a existência com precisão.
Matt B.
não está funcionando comigo, ele retorna o seguinte: Encerrando aplicativo devido à exceção não capturada 'NSInvalidArgumentException', motivo: '- [__ NSSingleObjectArrayI objectForKey:]: seletor não reconhecido enviado para a instância 0x60000133a1c0'
Amr Angry
2

Com a sintaxe literal, você pode verificar o seguinte

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
fonte