2010-10-12 37 views

Répondre

197

Une manière standard ressemblerait à ceci

for(id key in myDict) { 
    id value = [myDict objectForKey:key]; 
    [value doStuff]; 
} 
+5

J'ai rencontré plus de façons de faire ce mal que vous pouvez secouer un bâton. Je vous remercie!!! – mpemburn

+0

Si seulement il y avait une façon de faire quelque chose comme: 'pour (id clé, valeur dans myDict)' ce serait parfait. –

+0

Merci! Facile d'oublier la syntaxe simple parfois. – abriggs

22

Vous pouvez utiliser [dict allValues] pour obtenir une NSArray de vos valeurs. Sachez qu'il ne garantit aucune commande entre les appels.

+3

Je voudrais utiliser celui-ci sur la (clé d'id dans le dictionnaire), en particulier sur un dictionnaire mutable, car ce dernier jette une méchante erreur si le dictionnaire est modifié lors de l'énumération. – sigsegv

+0

"ce n'est pas garanti" - c'est souvent nécessaire (la plupart des langues ont une version du dictionnaire qui garantit la commande) - est-ce que * dans la pratique * conserve la commande? – Adam

+0

@Adam Sur MacOS X, j'avais un ordre plutôt mélangé (pas d'ordre d'insertion, pas d'ordre alphabétique, rien), mais cohérent entre les appels. – jv42

26

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.

1

Une autre façon est d'utiliser l'énumérateur Dicts. Voici quelques exemples de code d'Apple:

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

while ((value = [enumerator nextObject])) { 
    /* code that acts on the dictionary’s values */ 
} 
2
  1. Pour boucle simple, énumération rapide est un peu plus rapide que la boucle à base de blocs
  2. Il est plus facile de faire de l'énumération simultanée ou inverse avec énumération par blocs que par énumération rapide Lorsque boucle avec NSDictionary vous pouvez obtenir la clé et la valeur d'un seul coup avec un recenseur à base de blocs, alors que l'énumération rapide, vous devez utiliser la clé pour récupérer la valeur dans un message séparé envoyer

dans fas énumération t

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

dans les blocs:

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

    // do something with key and obj 
    }]; 
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]); 
    }