Enumere NSArray comenzando en el índice givven buscando ambas forms (no envuelve)

Ejemplo. Tengo una matriz con 15 objects. Quiero comenzar a enumerar desde un índice dado. Diga comenzar en el índice 5 y luego el índice anterior, el índice debajo, arriba, debajo de etc … No quiero que se ajuste, sino que más bien se detiene y continúa en dirección inexplorada.

Entonces, el order de los índices en mi ejemplo sería. 5, 6, 4, 7, 3, 8, 2, 9, 1, 10, 0, 11, 12, 13, 14

¿Cómo se puede hacer esto?

Aquí hay una implementación más compacta que no requiere crear subarreglos:

@implementation NSArray (Extensions) - (void)enumerateFromIndex:(NSUInteger)index goBothWaysUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block { BOOL stop = NO; for (NSUInteger i = 0; i < self.count && !stop; i++) { if (index + i < self.count) { block([self objectAtIndex:index + i], index + i, &stop); } if (i != 0 && !stop && i <= index) { block([self objectAtIndex:index - i], index - i, &stop); } } } @end 
 -(void)enumerateArray:(NSArray *)array inBothDirectionsFromIndex:(int)startIndex { for (int i=0; i<array.count; i++) { int index = startIndex; int indexAfter = startIndex + round(i/2.f) + (i%2 ? 0 : 1); int indexBefore = startIndex - round(i/2.f); if ((i%2 && indexAfter < array.count) || indexBefore < 0) { index = indexAfter; if (indexBefore < 0) index -= indexBefore + 1; } else if ((i > 0 && indexBefore > -1) || indexAfter > array.count-1) { index = indexBefore; if (indexAfter > array.count-1) index -= indexAfter - array.count;; } id item = [array objectAtIndex:index]; //Do what you want with the item here } } 

Responde a la pregunta, pero no es especialmente DRY y crear subarreglos lo hace less eficiente de lo que debería ser.

 @implementation NSArray (Extensions) - (void)enumerateFromIndex:(NSUInteger)index goBothWaysUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block { NSArray *lastObjects = [self subarrayFromIndex:index]; NSArray *firstObjects = [self subarrayToIndex:index]; int currentIndex = 0; NSEnumerator *firstObjectsEnumerator = [firstObjects reverseObjectEnumerator]; NSEnumerator *lastObjectsEnumerator = [lastObjects objectEnumerator]; BOOL shouldStop = NO; NSUInteger numberOfIndexesEnumerated = 0; id obj = nil; while(numberOfIndexesEnumerated < self.count) { if (obj = [lastObjectsEnumerator nextObject]) { NSInteger objIndex = [self indexOfObject:obj]; block(obj, objIndex, &shouldStop); currentIndex++; numberOfIndexesEnumerated++; } if (shouldStop) { return; } if (obj = [firstObjectsEnumerator nextObject]) { NSInteger objIndex = [self indexOfObject:obj]; block(obj, objIndex, &shouldStop); currentIndex++; numberOfIndexesEnumerated++; } if (shouldStop) { return; } } } @end 

Créditos a @jalmaas por esta respuesta