web-dev-qa-db-fra.com

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.

64
Thanks

Pour ajouter d'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

184
Sijmen Mulder

Comme il s’agit de performances, vous avez un certain nombre d’options et vous feriez bien de les essayer toutes pour voir laquelle fonctionne le mieux.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Crée une copie inversée du tableau puis effectue une itération normale
  • Utilisez un C standard pour la boucle, démarrez et reculez dans le tableau.

Méthodes plus extrêmes (si la performance est super critique)

  • Découvrez comment Cocoa implémente l'énumération rapide des objets et créez votre propre équivalent en sens inverse.
  • Utilisez un tableau C ou C++.

Il y en a peut-être d'autres. Dans ce cas, n'importe qui est libre de l'ajouter.

17
Mike Abdullah

De ici :

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

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
12
Naaff
[NsArray reverseObjectEnumerator]
2
CiNN
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}
0