在快速枚举中跟踪索引

时间:2011-11-13 17:55:26

标签: objective-c cocoa-touch fast-enumeration

我想在使用快速枚举时得到当前对象的索引,即

for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}

5 个答案:

答案 0 :(得分:64)

查看NSArray的API,您将看到方法

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

所以试一试

[savedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    //... Do your usual stuff here

    obj  // This is the current object
    idx  // This is the index of the current object
    stop // Set this to true if you want to stop

}];

答案 1 :(得分:9)

我认为最直接的解决办法就是手动递增索引。

NSUInteger indexInSavedArray = 0;
for (MyClass *entry in savedArray) {
   indexInSavedArray++;
 }

或者,您可以不使用快速枚举。

    for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
       [savedArray objectAtIndex:indexInSavedArray];
     }

答案 2 :(得分:7)

这个问题已经得到解答,但我想我会补充说,计数迭代实际上是iOS Developer Library文档中提到的技术:

NSArray *array = <#Get an array#>;
NSUInteger index = 0;

for (id element in array) {
    NSLog(@"Element at index %u is: %@", index, element);
    index++;
}

我确信会有一个奇特的伎俩,但我猜不是。 :)

答案 3 :(得分:3)

如果你想访问索引或返回外部块,这里有一段很有用的代码。 (考虑到数组是一个NSString数组)。

- (NSInteger) findElemenent:(NSString *)key inArray:(NSArray *)array
{
    __block NSInteger index = -1;
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isEqualToString:key]) {
            *stop = YES;
            index = idx;
        }
    }];
    return index;
}

答案 4 :(得分:0)

一个简单的观察:如果你将索引初始化为-1然后将++索引作为for循环中的第一行,那么这不会覆盖所有基础(前提是有人不会将代码放在前面增量)?