boucle sur un NSMutableDictionary

Réponses:

211

Une manière standard ressemblerait à ceci

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
la source
Si seulement il y avait un moyen de faire quelque chose comme: for (id key, value in myDict)ce serait parfait.
Luis Artola
4
Mieux vaut cependant parcourir les clés (c'est-à-dire id key in myDict.allKeys) plutôt que le dictionnaire. Cela vous permet de faire muter le dictionnaire, ce que vous voudrez peut-être faire.
marcel salathe
29

vous pouvez utiliser

[myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];

si votre système d'exploitation cible prend en charge les blocs.

Andrey Zverev
la source
22

Vous pouvez utiliser [dict allValues]pour obtenir une NSArrayde vos valeurs. Sachez que cela ne garantit aucun ordre entre les appels.

jv42
la source
3
J'utiliserais celui-ci sur la (clé id dans le dictionnaire), en particulier sur un dictionnaire mutable, car ce dernier jette une mauvaise erreur si le dictionnaire est modifié lors de l'énumération.
sigsegv
«ça ne garantit pas» - c'est souvent nécessaire (la plupart des langues ont une version du dictionnaire qui garantit l'ordre) - est-ce que cela préserve l'ordre dans la pratique ?
Adam
@Adam Sur MacOS X, j'avais un ordre assez mélangé (pas d'ordre d'insertion, pas alphabétique, rien), mais cohérent entre les appels.
jv42
Pourquoi utiliser un NSDictionary si les mappages n'ont pas d'importance?
stephen
2
@stephen Habituellement, cela compte quelque part et pas ailleurs. Vous obtenez également la contrainte de clé unique qui peut être utile dans certains cas.
jv42
4
  1. Pour une boucle simple, l'énumération rapide est un peu plus rapide que la boucle basée sur des blocs
  2. Il est plus facile de faire une énumération simultanée ou inversée avec une énumération basée sur des blocs qu'avec une énumération rapide.Lors de la boucle avec NSDictionary, vous pouvez obtenir la clé et la valeur en un seul appel avec un énumérateur basé sur des blocs, alors qu'avec une énumération rapide, vous devez utiliser la clé pour récupérer le valeur dans un message séparé envoyé

en énumération rapide

for(id key in myDictionary) {
   id value = [myDictionary objectForKey:key];
  // do something with key and obj
}

en blocs:

[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

   // do something with key and obj
  }];
user3540599
la source
3

Vous n'avez pas besoin d'attribuer une valeur à une variable. Vous pouvez y accéder directement avec myDict[key].

    for(id key in myDict) {
        NSLog(@"Key:%@ Value:%@", key, myDict[key]);
    }
Alexandre
la source
2

Une autre façon consiste à utiliser l'énumérateur Dicts. Voici un exemple de code d'Apple:

NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Hendrik
la source