我想在使用快速枚举时获取当前对象的索引,即
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|?
}
查看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
}];
我想最直接的解决方案是手动增加索引。
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,然后将 ++index 作为 for 循环中的第一行,那是否涵盖了所有基础(前提是有人没有在增量前面滑过代码)?