web-dev-qa-db-fra.com

pour chaque boucle dans Objective-C pour accéder à NSMutabledictionary

J'ai quelques difficultés à accéder aux clés et valeurs de dictionnaire mutables en Objective-C.

Supposons que j'ai ceci:

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

Je peux définir des clés et des valeurs. Maintenant, je veux juste accéder à chaque clé et valeur, mais je ne connais pas le nombre de clés défini.

En PHP c'est très facile, quelque chose comme ceci:

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

Comment est-ce possible dans Objective-C?

257
Sagar R. Kothari
for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

Cela fonctionne pour toutes les classes conformes au protocole NSFastEnumeration (disponible sur 10.5+ et iOS), bien que NSDictionary soit l’une des rares collections permettant d’énumérer des clés plutôt que des valeurs. Je vous suggère de lire à propos de énumération rapide dans le Sujet de programmation des collections .

Oh, je devrais ajouter cependant que vous devriez JAMAIS modifier une collection en énumérant à travers elle.

642
zneak

Juste pour ne pas laisser de côté l'option 10.6+ pour énumérer les clés et les valeurs en utilisant des blocs ...

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

Si vous voulez que les actions se déroulent simultanément:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
97
Quinn Taylor

Si vous avez besoin de muter le dictionnaire en énumérant:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
13
Brody Robertson

Le moyen le plus simple d’énumérer un dictionnaire est

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

tDictionary est la NSDictionary ou NSMutableDictionary que vous souhaitez itérer.

4
Avinash

Je vous suggère de lire la partie Énumération: parcourir les éléments d’une collection du Guide de programmation de collections pour Cocoa . Il existe un exemple de code pour vos besoins.

4
Laurent Etiemble

Une énumération rapide a été ajoutée à la version 10.5 et à l'iPhone OS, ce qui est nettement plus rapide, pas seulement le sucre syntaxique. Si vous devez cibler l’ancien runtime (à savoir 10.4 et inversement), vous devrez utiliser l’ancienne méthode d’énumération:

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" ...
}

Vous ne libérez pas l'objet énumérateur et vous ne pouvez pas le réinitialiser. Si vous voulez recommencer, vous devez demander un nouvel objet énumérateur à partir du dictionnaire.

2
dreamlax

Vous pouvez utiliser -[NSDictionary allKeys] pour accéder à toutes les clés et les parcourir en boucle.

1
gcamp