有没有一种简单的方法可以倒序迭代NSArray?

72

我有一个NSArray需要迭代,但在某些情况下需要反向迭代,以便首先查看最后一个元素。这是出于性能考虑:如果最后一个元素没有意义,那么所有之前的元素都可以被忽略。因此,我想中断循环。但是,如果我从0到n正向迭代,那将行不通。我需要从n到0进行迭代。也许有一种我不知道的方法或函数,这样我就不必重新发明轮子了。


4
如何在 Objective-C 中反转 NSArray?这是一个完全不同的问题。 - Nestor
Swift:https://dev59.com/questions/QWAf5IYBdhLWcg3wlDYD - Suragch
5个回答

199

除了其他答案外,您可以在Objective-C 2.0(Leopard、iPhone可用)中结合快速枚举功能使用-[NSArray reverseObjectEnumerator]

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

参考资料: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html


这是否被认为是快速枚举,比起从[myArray count]-1开始的普通C for循环更快?如何反向迭代一个 NSString - ma11hew28
我现在这里没有任何链接,但是有一个视频(可能是WWDC),其中一位苹果工程师解释了快速枚举的工作原理以及为什么它如此快速。它比基于索引的NSArray枚举和经典的Foundation枚举器都要快,并且根据情况而定,在某些情况下差距很大。 - Sijmen Mulder
我需要在一个字典上运行一个反向循环,怎么做? - Ashwin G
4
你的问题不太合理,因为 NSDictionary 没有 "顺序" 这个概念。除非你先对键/值进行排序,否则你可以按任意顺序枚举它们。 - mattsven

17

由于这是与性能相关的内容,您有多种选择,并且最好尝试它们以查看哪种效果最佳。

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • 创建一个反向副本数组,然后正常迭代遍历该数组
  • 使用标准的C语言for循环,从数组末尾开始倒序遍历。

如果性能非常关键,则可以采用以下更极端方法:

  • 研究Cocoa如何实现快速对象枚举,并创建自己的反向等效物。
  • 使用C或C++数组。

可能还有其他方法,请随意添加。


1
我认为enumerateObjectsWithOptions:NSEnumerationReverse是最好的答案,特别是如果你需要知道当前索引。谢谢!!! - Vincil Bishop

12

来自这里

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

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

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

这不会检测到在枚举(元素,计数)期间对可变数组实例的更改。否则,它可能比创建NSEnumerator对象稍快。 - osxdirk

2
[NsArray reverseObjectEnumerator]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接