Objective c 使用EnumerateObjectSatiIndex或for循环在给定索引之前遍历NSArray的所有索引

Objective c 使用EnumerateObjectSatiIndex或for循环在给定索引之前遍历NSArray的所有索引,objective-c,nsarray,iteration,nsrange,nsindexset,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) { // t

迭代在给定索引之前出现的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和索引集。有没有更好的方法让我俯瞰呢?

那么:

index = 2;
for (int i = 0; i < [myArray count] && i < index; ++i) {
   id currObj = [myArray objectAtIndex:i];
   // Do your stuff on currObj;
} 
index=2;
对于(int i=0;i<[myArray count]&&i
就我个人而言,我会使用基于块的枚举,如或所示,所接受的答案可能是最差的,因为它不提供突变保护

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

NSUInteger stopIndex = 2;
NSUInteger currentIndex = 0;
for (MyClass *obj in objArray) {
    if (currentIndex < stopIndex) {
        // do sth...
    } else {
        break;
    }
    ++currentIndex;      
}
nsu整数stopIndex=2;
整数currentIndex=0;
for(对象中的MyClass*obj){
如果(当前索引<停止索引){
//做某事。。。
}否则{
打破
}
++电流指数;
}

多种实现方法。简洁并不意味着清晰。使用能很好地完成实际工作的内容。不要与框架抗争。迭代NSArray不需要使用该方法。该方法提供了块使用,这对于块擅长的事情来说是非常好的。为什么
-1
NSMakeRange(-1,idx)
中?这不应该是
0
?@yourfriendzak。同时提供nil作为(NSEnumerationOption)options:的参数将给您一个类型转换警告。因此,与其在这里给出零,不如在想要忽略警告的情况下提供0。这是一个很好的警告。有没有一种方法可以在没有if/else的情况下实现这一点?类似于*stop=(idx==stopIndex)的东西?(return;):否@你的朋友扎克:不太好。根据文档,您应该只将
分配给
*停止
。从三元运算符中调用
return
就是我所说的“模糊编程”:-)这是由于枚举方法的另一个变体提供了并发枚举。为什么需要
I<[myArray count]
呢?如果索引>=[myArray count]您遇到了麻烦:)
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]     
                           options:0
                        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

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