3

遍历给定索引之前出现的 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,则根本不应该循环。

最简洁、最优雅的方法是什么?到目前为止,我只拼凑了使用烦人的 NSRange 和索引集的笨拙的多行答案。有没有更好的方法可以忽略?

4

4 回答 4

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);
    }
}];
于 2013-03-23T12:05:50.903 回答
3
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]     
                           options:0
                        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

}];
于 2013-03-23T12:19:09.197 回答
1

关于什么 :

index = 2;
for (int i = 0; i < [myArray count] && i < index; ++i) {
   id currObj = [myArray objectAtIndex:i];
   // Do your stuff on currObj;
} 
于 2013-03-23T12:03:30.193 回答
1

就我个人而言,我会使用Martin Ryourfriendzak所示的基于块的枚举,giorashc接受的答案可能是最糟糕的,因为它不提供突变防护。

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

NSUInteger stopIndex = 2;
NSUInteger currentIndex = 0;
for (MyClass *obj in objArray) {
    if (currentIndex < stopIndex) {
        // do sth...
    } else {
        break;
    }
    ++currentIndex;      
}
于 2014-03-09T17:28:26.523 回答