67 votes

Existe-t-il un moyen simple de parcourir en arrière un tableau NSArray?

J'ai un NSArray et dois l'itérer dans un cas particulier à l'envers, de sorte que je regarde d'abord le dernier élément. C'est pour des raisons de performances: si le dernier n'a aucun sens, tous les précédents peuvent être ignorés. Je voudrais donc briser la boucle. Mais cela ne fonctionnera pas si j'itère en avant de 0 à n. Je dois passer de n à 0. Il existe peut-être une méthode ou une fonction que je ne connais pas, alors je n'aurais pas à réinventer la roue ici.

191voto

Sijmen Mulder Points 1935

Pour ajouter les autres réponses, vous pouvez utiliser -[NSArray reverseObjectEnumerator] en combinaison avec la fonctionnalité d'énumération rapide d'Objective-C 2.0 (disponible dans Leopard, iPhone):

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

Source avec quelques informations supplémentaires: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

17voto

Mike Abdullah Points 9464

Depuis que c'est pour performace, vous avez un certain nombre d'options et serait bien avisé de toutes les essayer pour voir ce qui fonctionne le mieux.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Renverser la copie du tableau et puis itérer sur que normalement
  • L'utilisation d'un standard C pour la boucle de départ et un travail en arrière à travers la matrice.

De plus en plus extrêmes méthodes (si le rendement est super-critique)

  • Lire sur la façon de Cacao met en œuvre rapide de l'objet de l'énumération et de créer votre propre équivalent dans le sens inverse.
  • L'utilisation d'un C ou C++ tableau.

Il y a peut être d'autres. Dans ce cas, quelqu'un n'hésitez pas à ajouter.

12voto

Naaff Points 6637

À partir d' ici :

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

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

2voto

CiNN Points 3893
[NsArray reverseObjectEnumerator]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X