6

使用快速枚举时,知道何时到达数组中的最后一个对象的最佳方法是什么?有没有比增加一个 int 然后将其与数组的长度进行比较更好的方法?

4

5 回答 5

15

如果您从数组开始,请取出最后一个元素(对此有特定的调用)并将您在枚举器中获得的每个元素与该元素进行比较。就像是:

id lastEl = [myArray lastObject];

for ( id anEl in myArray )
{
   if ( anEl == lastEl )
     .....  // do the last thing
}

比较成本与计数器相同,但是您没有增加计数器的成本或当您忘记增加计数器时总是出现的错误。

于 2010-12-27T22:17:14.103 回答
2

通常,快速枚举意味着您没有使用计数器......

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html

另一种形式是没有计数器是......

NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
    ...
}
于 2010-12-27T22:13:41.063 回答
1

如果性能测试在这里负责的话,快速枚举和块枚举之间没有太大的性能差异。还是bbum这里说的“基于块的枚举允许集合类以最快的遍历原生存储格式的方式枚举内容。”

然后我会建议使用块枚举,这样你就可以同时得到索引和对象,你可以做比较。

于 2014-12-30T02:07:54.237 回答
0

我不相信有任何(简单的)方法可以做到这一点 - 这是使用快速枚举的权衡之一。因此,当您需要了解要枚举的项目的索引时,您需要按照您的建议创建一个整数。

也就是说,您仍然会受益于使用快速枚举器等时不能越界的事实。

于 2010-12-27T22:11:50.543 回答
0

您还可以将枚举与块一起使用:

[myArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    BOOL isLastObject = idx == [myArray count]-1;
    if (isLastObject){
        //...
    }
}];

如果您知道数组包含哪种对象,最好id用适当的类替换。

于 2016-04-25T17:01:12.190 回答