迭代在给定索引之前发生的NSArray索引的最简洁方法是什么?例如:
NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ];
[myArray enumerateObjectsAtIndexes:@"all before index 2" options:nil
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// this block will be peformed on @"animal" and @"vegetable"
}];
此外,如果给定的索引为0,则根本不应该循环。
最简洁,优雅的方法是什么?到目前为止,我只拼凑了使用恼人的NSRanges和索引集的笨拙的多行答案。我有一个更好的方式可以忽略吗?
答案 0 :(得分:3)
NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ];
NSUInteger stopIndex = 2;
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == stopIndex) {
*stop = YES; // stop enumeration
} else {
// Do something ...
NSLog(@"%@", obj);
}
}];
答案 1 :(得分:3)
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]
options:0
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
}];
答案 2 :(得分:1)
怎么样:
index = 2;
for (int i = 0; i < [myArray count] && i < index; ++i) {
id currObj = [myArray objectAtIndex:i];
// Do your stuff on currObj;
}
答案 3 :(得分:1)
就我个人而言,Martin R或yourfriendzak显示基于块的枚举,giorashc接受的答案可能是最差的,因为它没有提供变异守卫。
我想添加一个(正确的)快速枚举示例
NSUInteger stopIndex = 2;
NSUInteger currentIndex = 0;
for (MyClass *obj in objArray) {
if (currentIndex < stopIndex) {
// do sth...
} else {
break;
}
++currentIndex;
}