2009-05-09 13 views
60

Mam NSArray i muszę iterować nad nim w specjalnym pudełku do tyłu, tak że najpierw patrzę na ostatni element. Z przyczyn związanych z wydajnością: jeśli ostatnia nie ma sensu, wszystkie poprzednie można zignorować. Więc chciałbym przerwać pętlę. Ale to nie zadziała, jeśli przejdę do przodu od 0 do n. Muszę przejść od n do 0. Może istnieje metoda lub funkcja, o której nie wiem, więc nie musiałbym wymyślać tutaj koła.Czy istnieje łatwy sposób na powtórzenie NSArray do tyłu?

+4

"Jak mogę odwrócić NSArray w Objective-C?" to zupełnie inne pytanie. – Nestor

+0

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

Odpowiedz

179

Aby dodać na innych odpowiedzi, można użyć -[NSArray reverseObjectEnumerator] w połączeniu z szybkim funkcji wyliczania w Objective-C 2.0 (dostępny w systemie Leopard, iPhone):

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

Źródło z pewnym więcej informacji: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

+0

Czy jest to uważane za szybkie wyliczanie i czy jest to szybsze od zwykłej pętli for zaczynającej się od '[myArray count] -1'? Jak iterować po 'NSString' wstecz? – ma11hew28

+0

Nie mam tutaj żadnych odnośników, ale jest gdzieś wideo (mogło to być WWDC), gdzie inżynier Apple wyjaśnia, jak szybko działa wyliczanie i dlaczego jest szybki. Przewyższa zarówno wyliczenia NSArray oparte na indeksach, jak i klasyczne wyliczniki fundacji oraz, w zależności od scenariusza, wiele. –

+0

Muszę uruchomić odwrotny pętli w słowniku, jak to zrobić? –

2
[NsArray reverseObjectEnumerator] 
12

Od here:

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

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

Ponieważ jest to dla performance, masz kilka opcji i będzie dobrze poinformowani, aby spróbować ich wszystkich, aby zobaczyć, które działa najlepiej.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array i iterację tego zazwyczaj
  • używać standardowego C do pętli i zaczynają działać i do tyłu tablicy.

bardziej ekstremalne metody (jeśli wydajność jest super-krytyczne)

  • Poczytaj o tym, jak szybko Cocoa realizuje przedmiot wyliczanie i stworzyć swój własny odpowiednik w odwrotnej kolejności.
  • Użyj tablicy C lub C++.

Mogą być inne. W takim przypadku każdy może go dodać.

+1

Powiedziałbym, że enumerateObjectsWithOptions: NSEnumerationReverse jest najlepszą odpowiedzią, szczególnie jeśli musisz wiedzieć, na jakim jesteś indeksie. Dzięki!!! –

0
for (int i = ((int)[array count] - 1); i > -1; i--) { 
    NSLog(@"element: %@",array[i]); 
} 
Powiązane problemy