loop através de um NSMutableDictionary


Respostas:


211

Uma forma padrão seria assim

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

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.


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.


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
  }];

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]);
    }

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 */
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.