Есть ли простой способ итерации по NSArray назад?


У меня есть NSArray и придется перебирать его в особом случае назад, так что я сначала посмотрю на последний элемент. Это из соображений производительности: если последний просто не имеет смысла, все предыдущие можно игнорировать. Поэтому я хотел бы разорвать петлю. Но это не будет работать, если я повторяю вперед от 0 до n. мне нужно перейти от n к 0. Может быть, есть метод или функция, о которых я не знаю, поэтому мне не придется заново изобретать колесо здесь.

5 63

5 ответов:

чтобы добавить другие ответы, вы можете использовать -[NSArray reverseObjectEnumerator] в сочетании с функцией быстрого перечисления в Objective-C 2.0 (доступно в Leopard, iPhone):

for (id someObject in [myArray reverseObjectEnumerator])
{
    // print some info
    NSLog([someObject description]);
}

источник с некоторой дополнительной информацией:http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

Так как это для performace, у вас есть несколько вариантов и было бы неплохо попробовать их все, чтобы увидеть, что работает лучше всего.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • создать обратную копию массива а затем повторите это нормально
  • используйте стандартный C для цикла и начать и работать в обратном направлении через массив.

более экстремальные методы (если производительность super-critical)

  • читайте о том, как Cocoa реализует быстрое перечисление объектов и создает свой собственный эквивалент в обратном порядке.
  • используйте массив C или C++.

могут быть и другие. В этом случае, любой желающий может добавить его.

С здесь:

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
[NsArray reverseObjectEnumerator]
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}