2011-05-14 181 views
5

比方说,我有三个相同大小的数组。我必须对所有物体做些什么。如果我会用一个标准的C数组,我就喜欢写东西多个NSArray枚举

for (i = 0; i < size; i++) { 
    doSomething(array1[i]); // or [[array1 objectAtIndex:i] doSomething]; 
    doSomethingElse(array2[i]); // or [[array2 objectAtIndex:i] doSomethingElse]; 
    doSomethingReallySpecial(array3[i]); // or [[array3 objectAtIndex:i] doSomethingReallySpecial]; 
} 

有了目标C通过我们中的对象NSArray中得到了更多的方式来循环:快速列举,基于块的枚举和使用枚举。我应该使用哪一个,为什么?有什么不同?

编辑
其实这个问题可以配制这样的:如果用户需要使用一个数组,一个项目的索引应该使用哪个枚举?

回答

0

你应该使用最清楚地向代码读者表达你的代码意图的那个。除非你已经确定这个循环是一个重要的性能瓶颈,否则维护你的代码的能力就显得尤为重要。 (即for(id i in array))不提供索引。如果您不想使用C风格的循环,则-[NSArray enumerateObjectsUsingBlock:]会同时提供当前项目和索引,并可用于压缩多个阵列。我怀疑,对于多个阵列来说,C风格的方法在性能上往往会有效等价 - 并且对读者而言可能更清晰,但您应该将其描述为确定。

你在寻找什么是函数式编程中的一个常见习惯用法,当然可以在使用块的GCD之上实现,但是我不知道任何实现。

4

基于NSEnumerator的方法曾经是枚举的唯一支持方式。我想不出它对其他方面有什么优势 - 它更慢,更笨重,并且在很大程度上被其他方法所取代。

使用块允许很大的灵活性。一种方法可以接受一个块作为参数,并使用该枚举在几个不同的类别:

- (void) doSomethingToFruits:(void(^)(id,NSUInteger,BOOL*))block 
{ 
    [apples enumerateObjectsUsingBlock:block]; 
    [bananas enumerateObjectsUsingBlock:block]; 
    [kiwis enumerateObjectsUsingBlock:block]; 
} 

您也可以使用选项参数在enumerateObjectsUsingBlock:options:并发枚举内容,。

东西我喜欢快速列举的是,NSFastEnumeration协议允许我补充一点,可以接受的阵列或集合,(或哈希表或其他),但一个方法仍具有静态类型的参数检查:

- (void) addObjectsFromCollection:(id<NSFastEnumeration>)coll 
{ 
    for (id obj in coll) [self addObject:obj]; 
} 

否则,两者的语法在不同的上下文中似乎更合适。我发现如果一个方法的主体枚举了一个集合,那么如果我使用快速枚举就会更清楚,而如果我只想在更大的方法中对所有内容执行一个或两个动作,则块更简洁,但我想这部分是根据个人喜好。

附录:

如果你想跟踪的指数,该块选项接受一个索引作为参数。

+0

感谢您的彻底解答! – adubr 2011-05-14 21:11:44