dla każdej pętli w celu uzyskania dostępu do słownika NSM

Znajduję pewne trudności w dostępie do zmiennych kluczy słownikowych i wartości w Objective-C.

Załóżmy, że mam to:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

Mogę ustawić klucze i wartości. Chcę tylko uzyskać dostęp do każdego klucza i wartości, ale nie znam liczby ustawionych kluczy.

W PHP jest to bardzo proste, coś w następujący sposób:

foreach ($xyz as $key => $value)

Jak to możliwe w Objective-C?

Author: Dave DeLong, 2010-01-27

7 answers

for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

Działa to dla każdej klasy, która jest zgodna z protokołem NSFastEnumeration (dostępnym w wersjach 10.5+ i iOS), choć NSDictionary jest jedną z niewielu kolekcji, która pozwala na wyliczanie kluczy zamiast wartości. Proponuję poczytać o szybkim wyliczaniu w temacie Programowanie zbiorów .

Dodam jednak, że nie należynigdy modyfikować zbioru, wyliczając go.
 619
Author: zneak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 07:37:36

Aby nie pominąć opcji 10.6+ do wyliczania kluczy i wartości za pomocą bloków...

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

Jeśli chcesz, aby akcje miały miejsce jednocześnie:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
 95
Author: Quinn Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 05:43:35

Jeśli potrzebujesz zmutować słownik podczas wyliczania:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
 12
Author: Brody Robertson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-03 20:10:00

Proponuję przeczytać wyliczenie: przemierzanie elementów kolekcji część podręcznika programowania zbiorów dla Cocoa . Istnieje przykładowy kod do Twoich potrzeb.

 4
Author: Laurent Etiemble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 21:24:00

Najprostszym sposobem wyliczenia słownika jest

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}

Gdzie tDictionary jest NSDictionary lub NSMutableDictionary, które chcesz iterować.

 3
Author: Avinash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 07:49:56

Szybkie wyliczanie zostało dodane w 10.5 i w iPhone OS, i jest znacznie szybsze, nie tylko syntaktyczny cukier. 10.4 i Wstecz), musisz użyć starej metody wyliczania:

NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;

while ((key = [keyEnum nextObject]))
{
    id value = [myDict objectForKey:key];
    ... do work with "value" ...
}

Nie zwalniasz obiektu enumerator i nie możesz go zresetować. Jeśli chcesz zacząć od nowa, musisz poprosić o nowy obiekt enumerator ze słownika.

 2
Author: dreamlax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 06:12:57

Możesz użyć -[NSDictionary allKeys] aby uzyskać dostęp do wszystkich klawiszy i pętli przez to.

 1
Author: gcamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 00:42:26