Existe uma maneira fácil de interagir sobre um trás NSArray?
-
20-08-2019 - |
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.
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]);
}