NSDictionary - необходимо проверить, содержит ли словарь пару ключ-значение или нет

96

Мне просто нужно спросить следующее. Предположим, у меня есть словарь.

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

Теперь мне нужно проверить следующее

[xyz содержит значение ключа "b" ?? пара или нет?

Вопрос как?

Другой вопрос: как просто подсчитать общую пару "ключ-значение"?

Скажем например NSInteger mCount=[xyz keyCounts];

Сагар Р. Котари
источник

Ответы:

193

Просто спросите об этом objectForKey:@"b". Если он возвращается nil, то для этого ключа не устанавливается никаких объектов.

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

Изменить : Что касается вашего отредактированного второго вопроса, это просто NSUInteger mCount = [xyz count];. Оба эти ответа хорошо задокументированы и их легко найти в справочнике по классу NSDictionary ( [1] [2] ).

Мэтт Б.
источник
+1 Фактически, в документации прямо сказано следующее: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Дэйв Делонг,
6
Что делать, если ключ присутствует в словаре и его значение равно 0? Не могли бы мы ошибочно подумать, что ключа вообще нет в словаре?
jbx72487 01
13
@ jbx72487 Словари должны содержать объекты; objectForKey:возвращает id- указатель на объект Objective-C. Если вы храните числа, они должны быть «упакованы» в NSNumber . Даже если NSNumber равен нулю или false, он все равно будет действительным указателем, и приведенный выше код точно определит существование.
Мэтт Б.
не работает со мной, он возвращает следующее: Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [__ NSSingleObjectArrayI objectForKey:]: нераспознанный селектор отправлен в экземпляр 0x60000133a1c0'
Amr Angry
2

С буквальным синтаксисом вы можете проверить следующее

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
источник