lặp qua NSMutableDictionary


Câu trả lời:


211

Một cách tiêu chuẩn sẽ trông như thế này

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

Giá như có một cách làm gì đó như: for (id key, value in myDict)điều đó thật hoàn hảo.
Luis Artola,

4
Tốt hơn nên lặp qua các khóa (ví dụ id key in myDict.allKeys), thay vì từ điển. Điều này cho phép bạn thay đổi từ điển, đó có thể là những gì bạn muốn làm.
marcel chào

29

bạn có thể dùng

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

nếu hệ điều hành mục tiêu của bạn hỗ trợ khối.


22

Bạn có thể sử dụng [dict allValues]để nhận một NSArraytrong các giá trị của mình. Lưu ý rằng nó không đảm bảo bất kỳ thứ tự nào giữa các cuộc gọi.


3
Tôi sẽ sử dụng cái này trên (khóa id trong từ điển), đặc biệt là trên một từ điển có thể thay đổi, vì cái sau sẽ tạo ra một lỗi khó chịu nếu từ điển được sửa đổi trong khi được liệt kê.
sigsegv

"nó không đảm bảo" - điều này thường xuyên cần thiết (hầu hết các ngôn ngữ đều có phiên bản từ điển CÓ đảm bảo thứ tự) - nó có bảo đảm trật tự trong thực tế không?
Adam

@Adam Trên MacOS X, tôi có thứ tự khá hỗn hợp (không phải thứ tự chèn, không phải chữ cái, không có gì), nhưng nhất quán giữa các lần gọi.
jv42

Tại sao lại sử dụng NSDictionary nếu ánh xạ không quan trọng?
stephen

2
@stephen Thông thường nó quan trọng ở đâu đó và không quan trọng ở nơi khác. Bạn cũng nhận được ràng buộc khóa duy nhất có thể hữu ích cho một số trường hợp.
jv42

4
  1. Đối với vòng lặp đơn giản, liệt kê nhanh nhanh hơn một chút so với vòng lặp dựa trên khối
  2. Việc liệt kê đồng thời hoặc đảo ngược với kiểu liệt kê dựa trên khối sẽ dễ dàng hơn so với kiểu liệt kê nhanh Khi lặp với NSDictionary, bạn có thể lấy khóa và giá trị trong một lần nhấn với kiểu liệt kê dựa trên khối, trong khi với kiểu liệt kê nhanh, bạn phải sử dụng khóa để truy xuất giá trị trong một tin nhắn gửi riêng

trong sự liệt kê nhanh chóng

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

trong Khối:

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

   // do something with key and obj
  }];

3

Bạn không cần phải gán giá trị cho một biến. Bạn có thể truy cập trực tiếp với myDict[key].

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

2

Một cách khác là sử dụng Dicts Enumerator. Đây là một số mã mẫu từ Apple:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.