使用enumerateObjectsAtIndexes或for循环在给定索引之前迭代NSArray的所有索引

时间:2013-03-23 11:59:39

标签: objective-c nsarray iteration nsrange nsindexset

迭代在给定索引之前发生的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和索引集的笨拙的多行答案。我有一个更好的方式可以忽略吗?

4 个答案:

答案 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 Ryourfriendzak显示基于块的枚举,giorashc接受的答案可能是最差的,因为它没有提供变异守卫。

我想添加一个(正确的)快速枚举示例

NSUInteger stopIndex = 2;
NSUInteger currentIndex = 0;
for (MyClass *obj in objArray) {
    if (currentIndex < stopIndex) {
        // do sth...
    } else {
        break;
    }
    ++currentIndex;      
}