2009-05-09 17 views
60

Tengo un NSArray y tengo que iterar sobre él en un caso especial al revés, de modo que primero miro el último elemento. Es por motivos de rendimiento: si el último simplemente no tiene sentido, todos los anteriores pueden ignorarse. Entonces me gustaría romper el ciclo. Pero eso no funcionará si repito desde 0 a n. Necesito pasar de n a 0. Tal vez haya un método o función que desconozco, así que no tendría que reinventar la rueda aquí.¿Hay alguna manera fácil de iterar en un NSArray al revés?

+4

"¿Cómo puedo invertir un NSArray en Objective-C?" es una pregunta completamente diferente. – Nestor

+0

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

Respuesta

179

para añadir en las otras respuestas, puede utilizar -[NSArray reverseObjectEnumerator] en combinación con la función de enumeración rápida en Objective-C 2.0 (disponible en Leopard, iPhone):

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

Fuente con algo más de información: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

+0

¿Esto se considera una enumeración rápida, y es esto más rápido que un ciclo regular de bucle que comienza desde '[myContenido de array] -1 '? ¿Cómo se itera sobre un 'NSString' al revés? – ma11hew28

+0

No tengo ningún enlace aquí en este momento, pero hay un video en algún lugar (podría haber sido una WWDC) en el que un ingeniero de Apple explica qué tan rápido funciona la enumeración y por qué es rápido. Supera tanto a la enumeración de NSArray basada en índices como a los enumeradores de Foundation clásicos y, según el escenario, por mucho. –

+0

Tengo que ejecutar un revés para el bucle en un diccionario, ¿cómo hacerlo? –

2
[NsArray reverseObjectEnumerator] 
12

De here:

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

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

Dado que esto es para el performace, que tiene una serie de opciones y haría bien a probarlos todos para ver cuál funciona mejor.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array y luego iterar a través de que normalmente
  • Utilice un C estándar para bucle y iniciar y trabajar hacia atrás a través de la matriz.

métodos más extremos (si el rendimiento es supercrítico)

  • leer sobre cómo Cacao implementa la enumeración de objetos rápido y crear su propio equivalente a la inversa.
  • Usa una matriz C o C++.

Puede haber otros. En ese caso, cualquiera puede agregarlo.

+1

Yo diría que el enumerateObjectsWithOptions: NSEnumerationReverse es la mejor respuesta, especialmente si necesitas saber en qué índice estás. ¡¡¡Gracias!!! –

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