while for ejemplos bucle objective-c cocoa-touch fast-enumeration

objective-c - for - bucle while



Mantenga un registro del índice en una enumeración rápida (5)

Quiero obtener el índice del objeto actual al usar la enumeración rápida, es decir,

for (MyClass *entry in savedArray) { // What is the index of |entry| in |savedArray|? }


Mira la API para NSArray y verás el método

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

Así que dale una oportunidad

[savedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { //... Do your usual stuff here obj // This is the current object idx // This is the index of the current object stop // Set this to true if you want to stop }];


Supongo que la solución más contundente a esto sería simplemente incrementar un índice manualmente.

NSUInteger indexInSavedArray = 0; for (MyClass *entry in savedArray) { indexInSavedArray++; }

Alternativamente, simplemente no puede usar la enumeración rápida.

for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) { [savedArray objectAtIndex:indexInSavedArray]; }


Esta pregunta ya ha sido respondida, pero pensé que agregaría que contar iteraciones es en realidad la técnica mencionada en la documentación de la biblioteca del desarrollador de iOS:

NSArray *array = <#Get an array#>; NSUInteger index = 0; for (id element in array) { NSLog(@"Element at index %u is: %@", index, element); index++; }

Estaba seguro de que habría un truco elegante, pero supongo que no. :)


Una simple observación: si inicializa el índice en -1 y luego pone el índice ++ como la primera línea en el ciclo for, ¿no cubre eso todas las bases (siempre que alguien no deslice el código delante del incremento)?


Si desea acceder al índice o devolver el bloque externo, aquí hay un fragmento de código que puede ser útil. (considerando que la matriz es una matriz de NSString).

- (NSInteger) findElemenent:(NSString *)key inArray:(NSArray *)array { __block NSInteger index = -1; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isEqualToString:key]) { *stop = YES; index = idx; } }]; return index; }