Есть ли простой способ перебрать NSArray в обратном направлении? - PullRequest
65 голосов
/ 10 мая 2009

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

Ответы [ 5 ]

186 голосов
/ 10 мая 2009

Чтобы добавить другие ответы, вы можете использовать -[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

17 голосов
/ 10 мая 2009

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

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

Более экстремальные методы (если производительность сверхкритична)

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

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

12 голосов
/ 10 мая 2009

С здесь :

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

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
2 голосов
/ 10 мая 2009
[NsArray reverseObjectEnumerator]
0 голосов
/ 05 марта 2018
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...