2009-05-09 15 views
60

Ho uno NSArray e devo eseguirne l'iterazione in un caso speciale all'indietro, in modo che prima guardi l'ultimo elemento. È per motivi di prestazioni: se l'ultimo non ha senso, tutti i precedenti possono essere ignorati. Quindi mi piacerebbe rompere il loop. Ma questo non funzionerà se itererò avanti da 0 a n. Devo andare da n a 0. Forse c'è un metodo o una funzione che non conosco, quindi non dovrei re-inventare la ruota qui.C'è un modo semplice per iterare su un NSArray all'indietro?

+4

"Come posso annullare un NSArray in Objective-C?" è una domanda completamente diversa. – Nestor

+0

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

risposta

179

Per aggiungere alle altre risposte, è possibile utilizzare -[NSArray reverseObjectEnumerator] in combinazione con la funzione di enumerazione veloce in Objective-C 2.0 (disponibile in Leopard, iPhone):

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

Fonte con qualche informazione in più: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

+0

Questa è considerata l'enumerazione rapida, ed è più veloce di un normale ciclo c per il ciclo che inizia da '[myArray count] -1'? Come si fa a scorrere su un 'NSString' all'indietro? – ma11hew28

+0

Non ho nessun link qui adesso ma c'è un video da qualche parte (potrebbe essere stato un WWDC) dove un ingegnere Apple spiega come funziona l'enumerazione veloce e perché è veloce. Supera sia l'enumerazione NSArray basata sugli indici sia gli enumeratori classici di Foundation e, a seconda dello scenario, di molto. –

+0

Devo eseguire un reverse per loop su un dizionario, come fare? –

2
[NsArray reverseObjectEnumerator] 
12

Da here:

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

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

Dal momento che questo è per performace, si dispone di una serie di opzioni e farebbe bene a provarli tutti per vedere quale funziona meglio.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array e poi iterare che normalmente
  • Utilizzare un C standard per ciclo e aprire ritroso attraverso la matrice.

metodi più estremi (se le prestazioni sono super-critica)

  • leggere su come cacao implementa oggetto in rapido enumerazione e creare il proprio equivalente in senso inverso.
  • Utilizzare un array C o C++.

Ci possono essere altri. In tal caso, chiunque si senta libero di aggiungerlo.

+1

Direi che enumerateObjectsWithOptions: NSEnumerationReverse è la risposta migliore, specialmente se hai bisogno di sapere in quale indice sei. Grazie!!! –

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