loop através de um NSMutableDictionary

93

Como faço um loop por todos os objetos em um NSMutableDictionary, independentemente das chaves?

Rupert
fonte

Respostas:

211

Uma forma padrão seria assim

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
fonte
Se ao menos houvesse uma maneira de fazer algo assim: for (id key, value in myDict)isso seria perfeito.
Luis Artola
4
É melhor iterar por meio de chaves (ou seja id key in myDict.allKeys), em vez de pelo dicionário. Isso permite que você modifique o dicionário, que pode ser o que você deseja fazer.
marcel salathe
29

você pode usar

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

se o seu sistema operacional de destino suporta blocos.

Andrey Zverev
fonte
22

Você pode usar [dict allValues]para obter um NSArrayde seus valores. Esteja ciente de que isso não garante nenhuma ordem entre as ligações.

jv42
fonte
3
Eu usaria este sobre a (chave de id no dicionário), especialmente em um dicionário mutável, uma vez que o último gera um erro desagradável se o dicionário for modificado durante a enumeração.
sigsegv
"não garante" - isso é frequentemente necessário (a maioria dos idiomas tem uma versão de dicionário que garante a ordem) - na prática, preserva a ordem?
Adam
@Adam No MacOS X, eu tinha uma ordem bastante confusa (não a ordem de inserção, não alfabética, nada), mas consistente entre as chamadas.
jv42
Por que usar um NSDictionary se os mapeamentos não importam?
stephen
2
@stephen Normalmente importa em algum lugar e não em outro lugar. Você também obtém a restrição de chave exclusiva que pode ser útil para alguns casos.
jv42
4
  1. Para loop simples, a enumeração rápida é um pouco mais rápida do que o loop baseado em bloco
  2. É mais fácil fazer a enumeração simultânea ou reversa com enumeração baseada em bloco do que com enumeração rápida. Ao fazer um loop com NSDictionary, você pode obter a chave e o valor em um acerto com um enumerador baseado em bloco, enquanto com a enumeração rápida você precisa usar a chave para recuperar o valor em uma mensagem separada enviada

em enumeração rápida

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

em blocos:

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

   // do something with key and obj
  }];
usuário3540599
fonte
3

Você não precisa atribuir valor a uma variável. Você pode acessá-lo diretamente com myDict[key].

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

Outra maneira é usar o Dicts Enumerator. Aqui está um exemplo de código da Apple:

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

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