是否有一种简单的方法可以向后遍历NSArray?


70

我有一个NSArray并且必须在特例中向后迭代,以便我首先查看最后一个元素。这是出于性能方面的考虑:如果最后一个没有意义,则可以忽略之前的所有内容。所以我想打破循环。但是,如果我从0迭代到n,那将行不通。我需要从n到0。也许有一个我不知道的方法或函数,所以我不必在这里重新发明轮子。


4
“如何在Objective-C中反转NSArray?” 是一个完全不同的问题。
内斯特2014年

Answers:


194

要添加其他答案,可以-[NSArray reverseObjectEnumerator]与Objective-C 2.0(在Leopard,iPhone中提供)的快速枚举功能结合使用:

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

带有更多信息的来源:http : //cocoawithlove.com/2008/05/fast-enumeration-clarifications.html


这被认为是快速枚举,并且比从开始的常规c for循环要快[myArray count]-1吗?您如何在NSString向后迭代?
ma11hew28 2011年

我现在这里没有任何链接,但是某个地方有一个视频(本来可能是WWDC),苹果工程师在其中解释了枚举的工作速度以及为何如此之快。它胜过基于索引的NSArray枚举和经典的Foundation枚举,并且根据情况,性能要好得多。
Sijmen Mulder 2011年

我必须在字典上运行反向for循环,该怎么做?
Ashwin G

4
@AshwinG您的问题没有道理,因为NSDictionarys没有“顺序”。您可以以任何实际顺序枚举它们,除非您先对键/值进行排序。
mattsven '16

17

由于这是为了提高性能,因此您可以选择多种方法,因此建议您全部尝试一下以找出最有效的方法。

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • 创建数组的反向副本,然后正常进行遍历
  • 使用标准C进行循环,然后开始并向后遍历数组。

更极端的方法(如果性能至关重要)

  • 阅读有关Cocoa如何实现快速对象枚举的知识,并反向创建自己的等效对象。
  • 使用C或C ++数组。

可能还有其他。在这种情况下,任何人都可以随意添加它。


1
我会说enumerateObjectsWithOptions:NSEnumerationReverse是最好的答案,特别是如果您需要知道您在哪个索引上的话。谢谢!!!
Vincil Bishop 2014年

12

这里

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.