【发布时间】:2011-12-28 03:32:46
【问题描述】:
我想在使用快速枚举的时候得到当前对象的索引,即
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
【问题讨论】:
标签: objective-c cocoa-touch fast-enumeration
我想在使用快速枚举的时候得到当前对象的索引,即
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
【问题讨论】:
标签: objective-c cocoa-touch fast-enumeration
查看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
}];
【讨论】:
*stop = YES 使用停止标志(只是stop = YES 不起作用)
我想最直接的解决方案是手动增加索引。
NSUInteger indexInSavedArray = 0;
for (MyClass *entry in savedArray) {
indexInSavedArray++;
}
或者,您不能使用快速枚举。
for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
[savedArray objectAtIndex:indexInSavedArray];
}
【讨论】:
[savedArray indexOfObject:entry];:)
这个问题已经回答了,但我想我会补充一点,计算迭代实际上是 iOS 开发者库文档中提到的技术:
NSArray *array = <#Get an array#>;
NSUInteger index = 0;
for (id element in array) {
NSLog(@"Element at index %u is: %@", index, element);
index++;
}
我确信会有一个花哨的把戏,但我想不会。 :)
【讨论】:
NSUInteger index=-1;,然后在开始时增加索引吗?
如果您想访问索引或返回外部块,这里有一段代码很有用。 (考虑到数组是一个 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 循环中的第一行,那是否涵盖了所有基础(前提是有人没有在增量)?
【讨论】: