NSMutableDictionary üzerinden döngü yapmak


Yanıtlar:


211

Standart bir yol böyle görünür

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

Keşke şöyle bir şey yapmanın bir yolu for (id key, value in myDict)olsaydı : bu mükemmel olurdu.
Luis Artola

4
id key in myDict.allKeysSözlük yerine anahtarlar (yani ) aracılığıyla yinelemek daha iyidir. Bu, yapmak istediğiniz şey olabilecek sözlüğü değiştirmenize olanak tanır.
marcel salathe

29

kullanabilirsiniz

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

Hedef işletim sisteminiz blokları destekliyorsa.


22

Değerlerinizden [dict allValues]birini almak için kullanabilirsiniz NSArray. Çağrılar arasında herhangi bir sırayı garanti etmediğini unutmayın.


3
Bunu, özellikle değişken bir sözlükte (sözlükte id anahtarı) yerine kullanırdım, çünkü ikincisi, sözlük numaralandırılırken değiştirilirse kötü bir hata verir.
sigsegv

"garanti etmez" - bu sıklıkla gereklidir (çoğu dilde, sıralamayı garantileyen bir sözlük sürümü vardır) - pratikte düzeni koruyor mu?
Adam

@Adam MacOS X'te, sırayla oldukça karışıktım (ekleme sırası değil, alfabetik değil, hiçbir şey), ancak aramalar arasında tutarlı.
jv42

Eşlemeler önemli değilse neden NSDictionary kullanmalı?
stephen

2
@stephen Genellikle bir yerde önemlidir ve başka yerde değildir. Ayrıca, bazı durumlarda faydalı olabilecek benzersiz anahtar kısıtlamasını da elde edersiniz.
jv42

4
  1. Basit döngü için hızlı numaralandırma, blok tabanlı döngüden biraz daha hızlıdır
  2. Hızlı numaralandırmaya göre blok tabanlı numaralandırma ile eşzamanlı veya ters numaralandırma yapmak daha kolaydır NSDictionary ile döngü oluştururken, blok tabanlı bir numaralandırıcı ile tek bir vuruşta anahtar ve değer elde edebilirsiniz, oysa hızlı numaralandırmada anahtarı almak için ayrı bir mesajdaki değer gönder

hızlı numaralandırmada

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

Bloklarda:

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

   // do something with key and obj
  }];

3

Bir değişkene değer atamanıza gerek yoktur. Doğrudan ile erişebilirsiniz myDict[key].

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

2

Diğer bir yol da Dicts Numaralandırıcıyı kullanmaktır. İşte Apple'dan bazı örnek kodlar:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.