作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有三个相同大小的数组。我必须对所有对象做一些事情。如果我使用标准的 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 中对象的方法:快速枚举、基于 block 的枚举和使用枚举器。我应该使用哪一个,为什么?有什么区别?
编辑
其实这个问题可以这样表述:如果需要使用数组中某一项的索引,应该使用哪个枚举?
最佳答案
基于 NSEnumerator 的方法曾经是唯一受支持的枚举方法。我想不出它比其他方法有什么优势 - 它更慢、更笨重,并且在很大程度上已被其他方法取代。
使用 block 可以提供很大的灵 active 。一个方法可以接受一个 block 作为参数并使用它来枚举几个不同的集合:
- (void) doSomethingToFruits:(void(^)(id,NSUInteger,BOOL*))block
{
[apples enumerateObjectsUsingBlock:block];
[bananas enumerateObjectsUsingBlock:block];
[kiwis enumerateObjectsUsingBlock:block];
}
您还可以使用 enumerateObjectsUsingBlock:options:
中的选项参数来同时枚举内容。
我喜欢快速枚举的一点是,NSFastEnumeration 协议(protocol)允许我添加一个方法,它接受数组或集合(或哈希表或其他),但仍然对参数进行静态类型检查:
- (void) addObjectsFromCollection:(id<NSFastEnumeration>)coll
{
for (id obj in coll) [self addObject:obj];
}
否则,两者的语法似乎更适合不同的上下文。我发现如果一个方法的主体是在一个集合上枚举,那么如果我使用快速枚举会更清楚发生了什么,而如果我只想在一个更大的方法中间对所有内容执行一两个操作, block 更简洁,但我想这部分取决于个人喜好。
附录:
如果您想跟踪索引, block 选项接受索引作为参数。
关于objective-c - 多个 NSArray 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001959/
我是一名优秀的程序员,十分优秀!