Respuestas:
Sí, NSDictionary
admite enumeración rápida. Con Objective-C 2.0, puede hacer esto:
// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
El método alternativo (que debe usar si se dirige a Mac OS X anterior a 10.5, pero aún puede usarlo en 10.5 y iPhone) es usar un 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]);
El enfoque de bloque evita ejecutar el algoritmo de búsqueda para cada clave :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Aunque NSDictionary
se implementa como una tabla hash (lo que significa que el costo de buscar un elemento es O(1)
), las búsquedas aún ralentizan su iteración por un factor constante .
Mis medidas muestran que para un diccionario d
de números ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... resumiendo los números con el enfoque de bloque ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... en lugar del enfoque de bucle ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... es aproximadamente un 40% más rápido .
EDITAR : El nuevo SDK (6.1+) parece optimizar la iteración del bucle, por lo que el enfoque de bucle ahora es aproximadamente un 20% más rápido que el enfoque de bloque , al menos para el caso simple anterior.
Esta es una iteración usando el enfoque de bloque:
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.
}];
Con el autocompletado es muy rápido de configurar, y no tiene que preocuparse por escribir un sobre de iteración.
NSMutableDictionary
el proceso
Swift
sintaxis, consulte esta publicación: stackoverflow.com/a/24111700/419348