我想在使用快速枚举时得到当前对象的索引,即
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
答案 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循环中的第一行,那么这不会覆盖所有基础(前提是有人不会将代码放在前面增量)?