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;
}