Pergunta

Eu tenho um NSArray e tem que iterar sobre ele em um para trás de casos especiais, de modo que eu primeiro olhar para o último elemento. É por razões de desempenho: Se o último apenas não faz sentido, todas as anteriores podem ser ignorados. Então eu gostaria de quebrar o ciclo. Mas isso não vai funcionar se eu iterar para frente entre 0 e n. Eu preciso ir de n a 0. Talvez haja um método ou função que eu não sei sobre, então eu não teria que re-inventar a roda aqui.

Foi útil?

Solução

Para adicionar outras respostas, você pode usar -[NSArray reverseObjectEnumerator] em combinação com o recurso de contagem rápida em Objective-C 2.0 (disponível no Leopard, iPhone):

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

Fonte com mais algumas informações: http://cocoawithlove.com/2008/ 05 / fast-enumeração-clarifications.html

Outras dicas

Uma vez que este é para performace, você tem uma série de opções e seriam bem aconselhados para tentar todos eles para ver qual funciona melhor.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Criar uma cópia inversa da matriz e depois iterate através de que normalmente
  • Uso de um padrão para C loop e iniciar e para trás de trabalho através da matriz.

Mais métodos extremos (se o desempenho é super-crítica)

  • Leia-se sobre como implementos Cacau enumeração objeto rápido e criar o seu próprio equivalente ao contrário.
  • Uso de um C ou da matriz de C ++.

Pode haver outros. Nesse caso, qualquer um se sentir livre para adicioná-lo.

A partir aqui :

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

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
[NsArray reverseObjectEnumerator]
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top