Я хочу получить индекс текущего объекта при использовании быстрого перечисления, т.е.
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
Я хочу получить индекс текущего объекта при использовании быстрого перечисления, т.е.
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
Посмотрите на 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
}];
Я полагаю, что самым тупым решением для этого было бы просто увеличить индекс вручную.
NSUInteger indexInSavedArray = 0;
for (MyClass *entry in savedArray) {
indexInSavedArray++;
}
В качестве альтернативы вы можете просто не использовать быстрое перечисление.
for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
[savedArray objectAtIndex:indexInSavedArray];
}
Этот вопрос уже был дан ответ, но я подумал, что добавлю, что итерации подсчета - это на самом деле метод, упомянутый в документации библиотеки разработчиков iOS:
NSArray *array = <#Get an array#>;
NSUInteger index = 0;
for (id element in array) {
NSLog(@"Element at index %u is: %@", index, element);
index++;
}
Я был уверен, что будет причудливый трюк, но я думаю, нет.:)
Если вы хотите получить доступ к индексу или возвращать внешний блок, вот фрагмент кода, который может быть полезен. (учитывая, что массив представляет собой массив 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;
}
Простое наблюдение: если вы инициализируете индекс до -1, а затем помещаете индекc++ в качестве первой строки в цикле for, не охватывает ли это все базы (если кто-то не проскальзывает код перед приращение)?