2013-03-23 57 views
3

在给定索引之前迭代通过NSArray索引的最简洁方法是什么?例如:在给定索引之前使用enumerateObjectsAtIndexes或for循环遍历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

任意数量的方式来实现。简明并不意味着明确。使用什么做实际的工作。不要打架。迭代NSArray不需要使用该方法。该方法给出了块的使用情况,这对块的好处非常大。 – uchuugaka 2013-03-23 12:21:30

回答

1

什么:

index = 2; 
for (int i = 0; i < [myArray count] && i < index; ++i) { 
    id currObj = [myArray objectAtIndex:i]; 
    // Do your stuff on currObj; 
} 
+0

为什么需要“我 zakdances 2013-03-25 09:33:16

+0

if index> = [myArray count]你有麻烦:) – giorashc 2013-03-25 14:57:33

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); 
    } 
}]; 
+0

这是一个不错的选择。有没有办法做到这一点没有if/else?像* stop =(idx == stopIndex)? (return;):NO; – zakdances 2013-03-23 12:38:49

+0

@yourfriendzak:不是。根据文件,你应该只给''stop'分配YES。从三元运算符中调用'return'就是我所说的“混淆编程”:-) – 2013-03-23 12:43:30

+0

这个要求是由枚举方法的另一个变体提供的并发枚举引起的。 – bbum 2013-03-23 13:36:31

3
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]  
          options:0 
         usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

}]; 
+1

为什么在'NSMakeRange(-1,idx)'中有'-1'?该不该是'0'? – 2013-03-23 12:32:33

+0

@MartinR固定,谢谢 – zakdances 2013-03-23 12:34:19

+1

@yourfriendzak。还提供nil作为(NSEnumerationOption)选项的参数:会给你一个类型转换警告。所以宁可在这里给零,如果你想忽略这个警告,你最好提供0。 – Arslan 2013-04-29 09:45:14

1

个人而言,我会去与如图Martin Ryourfriendzak基于块的枚举,通过giorashc接受的答案是可能是最糟糕的,因为它不提供突变警卫。

我想添加一个(正确的)快速列举例如

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