perulangan melalui NSMutableDictionary

Jawaban:

211

Cara standar akan terlihat seperti ini

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
sumber
Andai saja ada cara untuk melakukan sesuatu seperti: for (id key, value in myDict)itu akan sempurna.
Luis Artola
4
Lebih baik mengulang melalui kunci (yaitu id key in myDict.allKeys), daripada kamus. Ini memungkinkan Anda untuk mengubah kamus, yang mungkin ingin Anda lakukan.
marcel salathe
29

kamu bisa memakai

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

jika OS target Anda mendukung pemblokiran.

Andrey Zverev
sumber
22

Anda dapat menggunakan [dict allValues]untuk mendapatkan NSArraynilai-nilai Anda. Ketahuilah bahwa itu tidak menjamin urutan apa pun di antara panggilan.

jv42
sumber
3
Saya akan menggunakan ini di atas (kunci id dalam kamus), terutama pada kamus yang bisa berubah, karena yang terakhir melempar kesalahan yang buruk jika kamus dimodifikasi saat disebutkan.
sigsegv
"tidak menjamin" - ini sering kali diperlukan (sebagian besar bahasa memiliki versi kamus yang TIDAK menjamin ketertiban) - apakah dalam praktiknya mempertahankan ketertiban?
Adam
@Adam Di MacOS X, saya memiliki urutan yang cukup campur aduk (bukan urutan penyisipan, bukan abjad, tidak ada), tetapi konsisten antar panggilan.
jv42
Mengapa menggunakan NSDictionary jika pemetaan tidak penting?
stephen
2
@stephen Biasanya itu penting di suatu tempat dan tidak di tempat lain. Anda juga mendapatkan batasan kunci unik yang mungkin berguna untuk beberapa kasus.
jv42
4
  1. Untuk loop sederhana, pencacahan cepat sedikit lebih cepat daripada loop berbasis blok
  2. Lebih mudah untuk melakukan pencacahan secara bersamaan atau terbalik dengan pencacahan berbasis blok daripada dengan pencacahan cepat. Saat melakukan perulangan dengan NSDictionary Anda bisa mendapatkan kunci dan nilai dalam satu pukulan dengan pencacah berbasis blok, sedangkan dengan pencacahan cepat Anda harus menggunakan kunci untuk mengambil nilai dalam pengiriman pesan terpisah

dalam pencacahan cepat

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

di Blok:

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

   // do something with key and obj
  }];
pengguna3540599
sumber
3

Anda tidak perlu memberikan nilai ke variabel. Anda dapat mengaksesnya secara langsung dengan myDict[key].

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

Cara lain adalah dengan menggunakan Dicts Enumerator. Berikut beberapa contoh kode dari Apple:

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

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