2011-01-08 17 views
69

Jak mogę sprawdzić, czy to istnieje ?:Sprawdź klucz istnieje w NSDictionary

[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] 

Chcę wiedzieć, czy ten klucz istnieje, czy nie. Jak mogę to zrobić?

Dziękuję bardzo :)

EDIT: DataArray ma w nim obiektów. A te obiekty to NSDictionaries.

+0

Jakiś powód, dla którego używasz '-valueForKey:' zamiast '-objectForKey:'? Ten pierwszy jest używany w kodowaniu wartości kluczowej i jest nieco wolniejszy od drugiego. –

Odpowiedz

149

Przypuszczam, że [dataArray objectAtIndex:indexPathSet.row] jest zwrócenie NSDictionary, w którym to przypadku można po prostu sprawdzić wynik valueForKey przeciwko zera.

Na przykład:

if([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // The key existed... 

} 
else { 
    // No joy... 

} 
34

Sprawdź, czy to nil:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // SetEntries exists in this dict 
} else { 
    // No SetEntries in this dict 
} 
46

Więc wiem, że już wybrana odpowiedź, ale uważam, że jest to dość przydatna jako kategoria na NSDictionary. W tym momencie zaczynasz osiągać efektywność przy tych wszystkich różnych odpowiedziach. Meh ... 6 1 ...

- (BOOL)containsKey: (NSString *)key { 
    BOOL retVal = 0; 
    NSArray *allKeys = [self allKeys]; 
    retVal = [allKeys containsObject:key]; 
    return retVal; 
} 
+0

Też napisałem tę samą metodę w mojej kategorii, ale mam dziwną awarię, kiedy używam UIImageWriteToSavedPhotosAlbum(). po zawężeniu zmieniam nazwę metody z parametru zawieraKey => kluczKlucza, a awaria zniknęła. – kaala

+0

To znacznie lepiej niż zaakceptowana odpowiedź. Chcę wyszukiwać według klucza, a nie, jeśli wartość klucza jest zerowa lub nie. Możesz mieć klucz w słowniku, który wskazuje na zerową wartość. A jednak klucz istnieje. Przyjęta odpowiedź nie obejmuje tego scenariusza. Ale to rozwiązanie tutaj ma. – Houman

+3

@Hooman: Nieprawidłowy klucz o wartości zero: drugi akapit dokumentacji NSDictionary (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference /Reference.html) stwierdza, że ​​"ani klucz, ani wartość nie mogą być zerowe, jeśli potrzebujesz reprezentować wartość pustą w słowniku, powinieneś użyć NSNull." Zarówno ta, jak i zaakceptowana odpowiedź działają dla twojego scenariusza, tj. Ze słownikiem, w którym wartość dla jakiegoś klucza jest zerowa (typu NSNull). –

0
if ((NSNull *)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // SetEntries exists in this dict 
} else { 
    // No SetEntries in this dict 
} 

To właściwą odpowiedź.

+0

jaka jest obsada od BOOL do NSNull *? –

0

Spróbuj tego:

if ([dict objectForKey:@"bla"]) { 
    // use obj 
} else { 
    // Do something else like create the object 
} 
+1

To może być poprawne pod względem technicznym wyjaśnienie, ale będziesz lepiej służyć społeczności (i prawdopodobnie uzyskasz więcej upvotes), jeśli przedstawisz bardziej szczegółową dyskusję na temat swojego rozumowania w treści odpowiedzi. Dlaczego właściwe jest użycie 'objectForKey:' zamiast innej metody? Dlaczego nie musisz wyraźnie sprawdzić wartości? W każdym razie użycie przykładowego kodu podanego w pytaniu ułatwiłoby powiązanie Twojego przykładu z pierwotnym pytaniem. – Palpatim

0

Ten robi to samo, ale z mniejszą ilością kodu:

if (dataArray[indexPathSet.row][@"SetEntries"] != nil) { /* the key exists */  } 
else             { /* the key doesn't exist */ } 
6

działa to również za pomocą literałów Objective-C, stosując następującą składnię:

NSDictionary *dict = @{ @"key1" : @"value1", @"key2" : @"value2" }; 
if (dict[@"key2"]) 
NSLog(@"Exists"); 
else 
NSLog(@"Does not exist"); 
+0

Dla wersji szybkiej poniżej działa kod. niech nagłówki: Słownik = httpResponse .allHeaderFields if (nagłówki [ "errorcode"] = nil!) { print ("klucz błąd istnieje") } –

0

Sprawdź słownik zawiera dowolną wartość. Wolę [dic allKeys] .count> 0, aby sprawdzić.

Powiązane problemy