Can I shift the objects in a NSMutableArray without creating a temporary array?
arrays, cocoa, nsmutablearray, shift
Solution
Try something like
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT -- I haven't tested that code, but that should help you solve the problem.
Problem
I thought I had it with, ``` void shiftArray(NSMutableArray *mutableArray, NSUInteger shift) { for (NSUInteger i = 0; i < [mutableArray count]; i++) { NSUInteger newIndex = (i + shift) % [mutableArray count]; [mutableArray exchangeObjectAtIndex:i withObjectAtIndex:newIndex]; } } ``` which turns 0,1,2,3,4 into 0,2,3,4,1 when I shift by one. The expected result is 4,0,1,2,3 I feel like I'm missing something obvious... Update: Thanks Matthieu, this is what my function looks like now. ``` void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) { for (NSUInteger i = shift; i > 0; i--) { NSObject *obj = [mutableArray lastObject]; [mutableArray insertObject:obj atIndex:0]; [mutableArray removeLastObject]; } } ``` I didn't know you could make a generic NSObject and put some subclass in it. It's all just pointers so I guess it's OK, right? It's hard to break the habit of thinking of these objects as bags of stuff rather than pointers to the bag.