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?
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.
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);
}];
Si vous avez besoin de muter le dictionnaire en énumérant:
for (NSString* key in xyz.allKeys) {
[xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
Le moyen le plus simple d’énumérer un dictionnaire est
for (NSString *key in tDictionary.keyEnumerator)
{
//do something here;
}
où tDictionary
est la NSDictionary
ou NSMutableDictionary
que vous souhaitez itérer.
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.
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.
Vous pouvez utiliser -[NSDictionary allKeys]
pour accéder à toutes les clés et les parcourir en boucle.