多个NSArray枚举

5

假设我有三个相同大小的数组。我需要对所有对象执行某些操作。如果我使用标准的C数组,那么我会写一些类似于以下的代码:

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];
}

使用Objective C,我们有更多的方法来循环遍历NSArray中的对象:快速枚举、基于块的枚举和使用枚举器。我应该使用哪一个?它们之间有什么区别?

编辑
实际上,这个问题可以这样表述:如果需要使用数组项的索引,应该使用哪种枚举方式?

2个回答

4

NSEnumerator-based方法曾经是唯一支持枚举的方式。我想不出它与其他方法相比有任何优势——它更慢,更难以控制,并且已被其他方法大多取代。

使用块允许很多灵活性。一个方法可以接受一个块作为参数,并使用它来枚举多个不同的集合:

- (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

你应该使用最能清晰地表达代码意图的方式来编写代码。除非你已经确定这些循环是重要的性能瓶颈,否则代码的可维护性更为重要。

话虽如此,仅仅使用快速枚举(即 for(id i in array))并不能提供索引。如果你不想使用 C 风格的循环,-[NSArray enumerateObjectsUsingBlock:] 可以提供当前项和索引,并且可以用于压缩多个数组。我怀疑,对于多个数组,C 风格的方法在性能上通常是等效的,而且可能更容易理解,但你应该进行性能分析以确保。

你正在寻找的是函数式编程中的常见习语,当然可以使用块在 GCD 上实现,但我不知道有任何实现。


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