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

StackOverflow https://stackoverflow.com/questions/844189

  •  20-08-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

  • Узнайте, как 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]);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top