2009-05-09 6 views
60

Ich habe eine NSArray und muss darüber in einem speziellen Fall rückwärts iterieren, so dass ich zuerst auf das letzte Element schaue. Es ist aus Performance-Gründen: Wenn die letzte nur keinen Sinn macht, können alle vorherigen ignoriert werden. Also würde ich gerne die Schleife brechen. Aber das wird nicht funktionieren, wenn ich von 0 nach n iteriere. Ich muss von n auf 0 gehen. Vielleicht gibt es eine Methode oder Funktion, von der ich nichts weiß, also müsste ich das Rad hier nicht neu erfinden.Gibt es eine einfache Möglichkeit, über ein NSArray rückwärts zu iterieren?

+4

"Wie kann ich ein NSArray in Objective-C umkehren?" ist eine ganz andere Frage. – Nestor

+0

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

Antwort

179

auf den anderen Antworten hinzuzufügen, Sie -[NSArray reverseObjectEnumerator] in Kombination mit der schnellen Enumeration-Funktion in Objective-C 2.0 (erhältlich in Leopard, iPhone) verwenden können:

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

Quelle mit einem paar mehr Info: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

+0

Wird dies als schnelle Aufzählung betrachtet und ist dies schneller als eine reguläre c for-Schleife, die mit '[myArray count] -1' beginnt? Wie iteriert man über einen 'NSString' rückwärts? – ma11hew28

+0

Ich habe momentan keine Links hier, aber irgendwo gibt es ein Video (könnte eine WWDC gewesen sein), wo ein Apple Ingenieur erklärt, wie schnell die Enumeration funktioniert und warum sie schnell ist. Es übertrifft sowohl die indexbasierte NSArray-Enumeration als auch die klassischen Foundation-Enumeratoren und, je nach Szenario, sehr viel. –

+0

Ich muss eine umgekehrte Schleife für ein Wörterbuch ausführen, wie geht das? –

2
[NsArray reverseObjectEnumerator] 
12

Von here:

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

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

Da dies für performace, Ihnen eine Reihe von Optionen zur Verfügung und sind gut beraten, sie alle zu sehen, welche am besten funktioniert, um zu versuchen.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array und dann durchlaufen, die normalerweise
  • Verwendung eines Standard-C-Schleife und beginnen und rückwärts durch das Array arbeiten.

Extremere Methoden (wenn die Leistung super-kritisch)

  • Lesen Sie, wie Cocoa implementiert schnelles Objekt Aufzählung und Ihre eigene Äquivalent in umgekehrten erstellen.
  • Verwenden Sie ein C- oder C++ - Array.

Es kann andere geben. In diesem Fall kann jeder es hinzufügen.

+1

Ich würde sagen, dass die enumerateObjectsWithOptions: NSEnumerationReverse ist die beste Antwort, vor allem wenn Sie müssen wissen, auf welchem ​​Index Sie sind. Vielen Dank!!! –

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