web-dev-qa-db-ja.com

高速列挙でインデックスを追跡する

高速列挙を使用するときに現在のオブジェクトのインデックスを取得したい、つまり.

for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
28
Shri

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

}];
64
Paul.s

これに対する最も率直な解決策は、単にインデックスを手動でインクリメントすることだと思います。

NSUInteger indexInSavedArray = 0;
for (MyClass *entry in savedArray) {
   indexInSavedArray++;
 }

または、高速列挙を使用することもできません。

    for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
       [savedArray objectAtIndex:indexInSavedArray];
     }
9
Josh Rosen

この質問はすでに回答済みですが、反復のカウントは実際にはiOS DeveloperLibraryのドキュメントに記載されている手法であると付け加えたいと思います。

NSArray *array = <#Get an array#>;
NSUInteger index = 0;

for (id element in array) {
    NSLog(@"Element at index %u is: %@", index, element);
    index++;
}

派手なトリックがあると確信していましたが、そうではないと思います。 :)

7
GrandAdmiral

インデックスにアクセスしたり、ブロックの外側に戻ったりする場合は、ここに役立つコードがあります。 (配列は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;
}
3
karim

簡単な観察:インデックスを-1に初期化してから、++インデックスをforループの最初の行として配置すると、すべてのベースがカバーされませんか(誰かがインクリメントの前にコードをスリップしない場合)?

0
SilkyMacGuy