高速列挙を使用するときに現在のオブジェクトのインデックスを取得したい、つまり.
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 DeveloperLibraryのドキュメントに記載されている手法であると付け加えたいと思います。
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に初期化してから、++インデックスをforループの最初の行として配置すると、すべてのベースがカバーされませんか(誰かがインクリメントの前にコードをスリップしない場合)?