28

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

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

5 回答 5

65

查看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

}];
于 2011-11-13T18:13:52.473 回答
9

我想最直接的解决方案是手动增加索引。

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

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

    for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
       [savedArray objectAtIndex:indexInSavedArray];
     }
于 2011-11-13T17:59:55.643 回答
7

这个问题已经得到解答,但我想我会补充一点,计算迭代实际上是 iOS 开发人员库文档中提到的技术:

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

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

我确信会有一个花哨的把戏,但我想不会。:)

于 2012-01-09T02:53:23.630 回答
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;
}
于 2015-06-30T07:55:28.887 回答
0

一个简单的观察:如果您将索引初始化为 -1,然后将 ++index 作为 for 循环中的第一行,那是否涵盖了所有基础(前提是有人没有在增量前面滑过代码)?

于 2013-05-15T20:19:01.397 回答