Muszę sprawdzić, czy dykt ma klucz, czy nie. W jaki sposób?
objective-c
foundation
dontWatchMyProfile
źródło
źródło
NSDictionary
zawiera żadnego klucza (niespecyficzna) należy użyć[dictionary allKeys].count == 0
Jeślicount
to0
nie istnieją żadne klucze wNSDictionary
.Odpowiedzi:
objectForKey
zwróci zero, jeśli klucz nie istnieje.źródło
[NSNull null]
zamiast tego.lub
źródło
Nowsze wersje Objective-C i Clang mają do tego nowoczesną składnię:
Nie musisz sprawdzać równości z wartością zero, ponieważ tylko słowniki Objective-C inne niż zero mogą być przechowywane w słownikach (lub tablicach). Wszystkie obiekty Objective-C są prawdziwymi wartościami. Nawet
@NO
,@0
i[NSNull null]
ocenić, jak prawdziwe.Edycja: Swift jest teraz rzeczą.
W przypadku Swift wypróbujesz coś takiego
Ta składnia wykona blok if tylko wtedy, gdy myKey znajduje się w dykcie, a jeśli tak, to wartość jest przechowywana w zmiennej wartości. Zauważ, że działa to nawet dla wartości falsey, takich jak 0.
źródło
źródło
Podczas korzystania ze słowników JSON:
źródło
Podoba mi się odpowiedź Fernandesa, mimo że dwukrotnie pytasz o obiekt.
Powinno to również zrobić (mniej więcej to samo, co Martin's A).
Martin i ta odpowiedź działają zarówno na iPadzie2 iOS 5.0.1 9A405
źródło
Jedna bardzo nieprzyjemna gotcha, która zmarnowała trochę mojego czasu na debugowanie - może pojawić się monit o automatyczne uzupełnianie, aby spróbować użyć tego,
doesContain
co wydaje się działać.Z wyjątkiem tego, że
doesContain
używa porównania id zamiast porównania skrótu używanego przezobjectForKey
więc jeśli masz słownik z kluczami łańcuchowymi, to zwróci NIE do adoesContain
.źródło
Używając Swift, byłoby to:
źródło
Tak. Tego rodzaju błędy są bardzo częste i prowadzą do awarii aplikacji. Używam więc, aby dodać NSDictionary do każdego projektu, jak poniżej:
Kod pliku //.h:
Kod pliku //.m jest jak poniżej
W kodzie możesz użyć, jak poniżej:
źródło
Aby sprawdzić istnienie klucza w NSDictionary:
źródło
Ponieważ zero nie może być przechowywane w strukturach danych Fundacji,
NSNull
czasami ma reprezentowaćnil
. PonieważNSNull
jest to obiekt singletonowy, możesz sprawdzić, czyNSNull
wartość jest przechowywana w słowniku, używając bezpośredniego porównania wskaźnika:źródło
NSNull
instancja singletonu została zapisana w słowniku jako wartość klucza@"myKey"
. To zupełnie inna sprawa niż klucz, którego@"myKey"
nie ma w słowniku - w istocie oba się wykluczają.Rozwiązanie dla szybkiego 4.2
Jeśli więc chcesz tylko odpowiedzieć na pytanie, czy słownik zawiera klucz, zapytaj:
Jeśli chcesz tę wartość i wiesz, że słownik zawiera klucz, powiedz:
Ale jeśli, jak to zwykle bywa, nie wiesz, że zawiera on klucz - chcesz go pobrać i użyć, ale tylko jeśli istnieje - użyj czegoś takiego
if let
:źródło
Sugeruję zapisanie wyniku wyszukiwania w zmiennej temp, przetestowanie, czy zmienna temp jest zerowa, a następnie użycie jej. W ten sposób nie spojrzysz dwukrotnie na ten sam obiekt:
źródło
Jak Adirael zasugerował,
objectForKey
aby sprawdzić kluczową egzystencję, ale kiedy wywołujeszobjectForKey
słownik zerowy, aplikacja ulega awarii, więc naprawiłem to w następujący sposób.}
źródło
źródło