วนลูปผ่าน NSMutableDictionary


คำตอบ:


210

วิธีมาตรฐานจะมีลักษณะเช่นนี้

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

หากมีเพียงวิธีการทำสิ่งที่ต้องการfor (id key, value in myDict)นั่นก็จะสมบูรณ์แบบ
Luis Artola

4
ดีกว่าที่จะวนซ้ำผ่านคีย์แม้ว่า (เช่นid key in myDict.allKeys) มากกว่าพจนานุกรม วิธีนี้ช่วยให้คุณสามารถเปลี่ยนพจนานุกรมได้ซึ่งอาจเป็นสิ่งที่คุณต้องการทำ
marcel salathe

29

คุณสามารถใช้ได้

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

หากระบบปฏิบัติการเป้าหมายของคุณรองรับการบล็อก


22

คุณสามารถใช้[dict allValues]เพื่อรับค่าNSArrayของคุณ โปรดทราบว่าไม่รับประกันการสั่งซื้อระหว่างการโทร


3
ฉันจะใช้อันนี้กับ (รหัสรหัสในพจนานุกรม) โดยเฉพาะอย่างยิ่งในพจนานุกรมที่ไม่แน่นอนเนื่องจากคำหลังจะแสดงข้อผิดพลาดที่น่ารังเกียจหากพจนานุกรมถูกแก้ไขในขณะที่มีการแจกแจง
sigsegv

"ไม่รับประกัน" - สิ่งนี้จำเป็นบ่อยครั้ง (ภาษาส่วนใหญ่มีพจนานุกรมเวอร์ชันที่รับรองคำสั่งซื้อ) - ในทางปฏิบัติรักษาคำสั่งหรือไม่?
อดัม

@Adam บน MacOS X ฉันมีคำสั่งผสมกันมาก (ไม่ใช่ลำดับการแทรกไม่ใช่ตัวอักษรไม่มีอะไรเลย) แต่สอดคล้องกันระหว่างการโทร
jv42

ทำไมต้องใช้ NSDictionary ถ้าการแมปไม่สำคัญ
stephen

2
@stephen มักจะมีความสำคัญที่ไหนสักแห่งไม่ใช่ที่อื่น นอกจากนี้คุณยังได้รับข้อ จำกัด ของคีย์ที่ไม่ซ้ำกันซึ่งอาจเป็นประโยชน์สำหรับบางกรณี
jv42

4
  1. สำหรับลูปแบบธรรมดาการแจงนับอย่างรวดเร็วจะเร็วกว่าลูปแบบบล็อกเล็กน้อย
  2. การแจงนับพร้อมกันหรือย้อนกลับด้วยการแจงนับตามบล็อกง่ายกว่าการแจงนับอย่างรวดเร็วเมื่อวนลูปด้วย NSDictionary คุณจะได้รับคีย์และค่าในการตีครั้งเดียวด้วยตัวแจงนับตามบล็อกในขณะที่การแจงนับอย่างรวดเร็วคุณต้องใช้คีย์เพื่อดึงข้อมูล ค่าในการส่งข้อความแยกต่างหาก

ในการแจงนับอย่างรวดเร็ว

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

ในบล็อก:

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

   // do something with key and obj
  }];

3

คุณไม่จำเป็นต้องกำหนดค่าให้กับตัวแปร คุณสามารถเข้าถึงได้โดยตรงด้วยmyDict[key].

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

2

อีกวิธีหนึ่งคือการใช้ Dicts Enumerator นี่คือตัวอย่างโค้ดบางส่วนจาก Apple:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.