Подтвердить что ты не робот

Следить за индексом в быстром перечислении

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

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

Ответ 1

Посмотрите на 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

}];

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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