Відповіді:
Так, NSDictionary
підтримує швидке перерахування. За допомогою Objective-C 2.0 ви можете це зробити:
// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
Альтернативним методом (який ви повинні використовувати, якщо ви орієнтуєтесь на Mac OS X до 10.5, але ви все ще можете використовувати на 10.5 та iPhone), це використовувати NSEnumerator
:
NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
Блок підходу дозволяє уникнути запуску алгоритму пошуку для кожної клавіші :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Навіть незважаючи на те, що NSDictionary
він реалізований як хеш- файл (це означає, що вартість пошуку елемента є O(1)
), пошук все ще сповільнює вашу ітерацію постійним фактором .
Мої вимірювання показують, що для словника d
чисел ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... підведення підсумків чисел при блоковому підході ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... а не циклічний підхід ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... швидше на 40% .
EDIT : Новий SDK (6.1+), схоже, оптимізує ітерацію циклу, тому підхід до циклу зараз приблизно на 20% швидше, ніж блок-підхід , принаймні для простого випадку вище.
Це ітерація з використанням блокового підходу:
NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@->%@",key,obj);
// Set stop to YES when you wanted to break the iteration.
}];
З автоматичним завершенням налаштовується дуже швидко, і вам не доведеться турбуватися про те, щоб написати конверт ітерації.
NSMutableDictionary
у процесі
Swift
синтаксисі, передати цей пост: stackoverflow.com/a/24111700/419348