perulangan melalui NSMutableDictionary


Jawaban:


211

Cara standar akan terlihat seperti ini

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

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.


22

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


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

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

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 */
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.