2011-06-11 55 views
0

是否有一种简单的方法可以快速枚举数组中的一系列对象?喜欢的东西...Objective-C - 快速枚举数组的子集?

for (Object *object in myArray startingAtIndex:50) { 
    //do stuff 
} 

...避免不得不做这样的事情......

for (Object *object in myArray) { 
    NSUInteger index = [myArray indexOfObject:object]; 
    if (index >= 50) { 
     //do stuff 
    } 
} 

感谢。

回答

5

这些都在我的脑海:

for (Object *object in [myArray subArrayWithRange:NSMakeRange(50, ([myArray count] - 49))]) { 
    //do stuff 
} 

这比手动枚举这样虽然会创建一个临时数组,从而潜在地更慢(基准它!):

NSUInteger arrayCount = [myArray count]; 
for (NSUInteger i = 50; i < arrayCount; i++) { 
    Object *object = [myArray objectAtIndex]; 
    // do stuff 
} 
+0

无论是更快不得不通过分析确定。 'subArrayWithRange:'方法可能会更快。 – Sven 2011-06-11 16:24:52

+0

是的,因此“潜在”。 ;) – Regexident 2011-06-11 16:26:33

+0

你的意思是'我 DenverCoder9 2011-06-11 16:47:28

6

如果myArray是不可改变,那么subArrayWithRange:可能是不会复制指针,虽然retain可能仍然必须发送到everyt在子阵列中兴奋。

总的来说,这并不重要。我老实说从未见过一个例子,即快速枚举与indexOfObject:足以导致性能问题值得关注(总会有更糟的情况:)。

另一种方法;使用enumerateBlock:并简单地从索引返回游侠(并使用停止标志)。

[myArray enumerateWithBlock: ^(id o, NSUInteger i, BOOL *f) { 
    if (i < 10) return; 
    if (i > 20) { *f = YES; return; } 
    ... process objects in range ... 
}]; 

(你甚至可以使用options:变种同时枚举。)

+0

+1 - 虽然我没有使用解决方案,但这也是很好的建议。 – DenverCoder9 2011-06-13 11:01:07