NSDictionary - należy sprawdzić, czy słownik zawiera parę klucz-wartość, czy nie

96

Muszę tylko zapytać o coś w następujący sposób. Załóżmy, że mam słownik.

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

Teraz muszę sprawdzić, co następuje

[xyz zawiera wartość klucza "b"? para czy nie?

Pytanie brzmi jak?

Drugie pytanie brzmi: Jak po prostu policzyć całkowitą parę klucz-wartość?

Powiedz na przykład NSInteger mCount=[xyz keyCounts];

Sagar R. Kothari
źródło

Odpowiedzi:

193

Po prostu poproś o objectForKey:@"b". Jeśli zwraca nil, żaden obiekt nie jest ustawiony pod tym kluczem.

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

Edycja : co do edytowanego drugiego pytania, to jest po prostu NSUInteger mCount = [xyz count];. Obie te odpowiedzi są dobrze udokumentowane i łatwo je znaleźć w opisie klasy NSDictionary ( [1] [2] ).

Matt B.
źródło
+1 W rzeczywistości dokumentacja mówi tak: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong
6
A co, jeśli klucz jest obecny w słowniku, a jego wartość to 0? Czy nie pomylilibyśmy się, że klucza w ogóle nie ma w słowniku?
jbx72487
13
@ jbx72487 Słowniki muszą zawierać obiekty; objectForKey:zwraca id- wskaźnik do obiektu Objective-C. Jeśli przechowujesz numery, muszą one być „opakowane” w NSNumber . Nawet jeśli NSNumber ma wartość zero lub false, nadal będzie prawidłowym wskaźnikiem, a powyższy kod dokładnie wykryje istnienie.
Matt B.
nie działa ze mną, zwraca następujące informacje: Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInvalidArgumentException”, przyczyna: „- [__ NSSingleObjectArrayI objectForKey:]: nierozpoznany selektor wysłany do instancji 0x60000133a1c0”
Amr Angry
2

Za pomocą składni literału możesz sprawdzić w następujący sposób

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
źródło