Следите за индексом в быстром перечислении - PullRequest
28 голосов
/ 13 ноября 2011

Я хочу получить индекс текущего объекта при использовании быстрого перечисления, т.е.

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

Ответы [ 5 ]

64 голосов
/ 13 ноября 2011

Посмотрите API для NSArray , и вы увидите метод

- (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

}];
9 голосов
/ 13 ноября 2011

Полагаю, самым грубым решением было бы просто увеличить индекс вручную.

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

В качестве альтернативы, вы можете просто не использовать быстрое перечисление.

    for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
       [savedArray objectAtIndex:indexInSavedArray];
     }
7 голосов
/ 09 января 2012

На этот вопрос уже был дан ответ, но я подумал, что добавлю, что подсчет итераций на самом деле является техникой, упомянутой в документации библиотеки iOS для разработчиков:

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

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

Я был уверен, что будет хитрый трюк,но я думаю нет.:)

3 голосов
/ 30 июня 2015

Если вы хотите получить доступ к индексу или вернуться к внешнему блоку, вот фрагмент кода, который может быть полезен. (учитывая, что массив является массивом 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;
}
0 голосов
/ 16 мая 2013

Простое наблюдение: если вы инициализируете индекс -1, а затем поместите индекс ++ в качестве первой строки в цикле for, разве это не охватывает все базы (при условии, что кто-то не пропустит код перед инкремент)

...