Есть ли простой способ перебрать NSArray назад?
-
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]);
}