2009-05-09 3 views
60

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

+4

«Как я могу изменить NSArray в Objective-C?» это совершенно другой вопрос. – Nestor

+0

Swift: http://stackoverflow.com/questions/24508592/how-to-iterate-for-loop-in-reverse-order-in-swift – Suragch

ответ

179

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

+0

Рассматривается ли это быстрое перечисление, и это быстрее, чем обычный цикл c, который начинается с '[myArray count] -1'? Как вы повторяете «NSString» назад? – ma11hew28

+0

У меня сейчас нет ссылок, но есть где-то видео (возможно, это WWDC), где инженер Apple объясняет, как быстро работает перечисление и почему это быстро. Он превосходит индексирование NSArray, основанное на индексах, и классические перечисления фонда и, в зависимости от сценария, много. –

+0

Мне нужно запустить обратный цикл для словаря, как это сделать? –

12

here От:

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

while(anObject = [myIterator nextObject]) 
{ 
    /* do something useful with anObject */ 
} 
16

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

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array, а затем итерации, которые обычно
  • использовать стандартный C для цикла и начать работать в обратном направлении и через массив.

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

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

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

+1

Я бы сказал, что наилучшим ответом является enumerateObjectsWithOptions: NSEnumerationReverse, особенно если вам нужно знать, в каком индексе вы находитесь. Благодаря!!! –

0
for (int i = ((int)[array count] - 1); i > -1; i--) { 
    NSLog(@"element: %@",array[i]); 
} 
Смежные вопросы