stop
ブロックへの引数により、列挙を途中で停止できます。これbreak
は、通常のfor
ループと同じです。配列内のすべてのオブジェクトを調べたい場合は、無視できます。
for( id obj in arr ){
if( [obj isContagious] ){
break; // Stop enumerating
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
continue; // Skip this object
}
[obj immanetizeTheEschaton];
}
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if( [obj isContagious] ){
*stop = YES; // Stop enumerating
return;
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
return; // Skip this object
}
[obj immanentizeTheEschaton];
}];
これは、呼び出しスコープからの変数への参照であるため、出力パラメーターです。ブロック内で設定する必要がありますが、内で読み取るとenumerateObjectsUsingBlock:
、NSError
フレームワークコールからにコードが返されるのと同じ方法です。
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
// N.B: This is probably not how this method is actually implemented!
// It is just to demonstrate how the out parameter operates!
NSUInteger idx = 0;
for( id obj in self ){
BOOL stop = NO;
block(obj, idx++, &stop);
if( stop ){
break;
}
}
}
stop
フラグは参考用です。たとえば、並行処理の場合、列挙はいくつかの未定義の反復で継続する場合があります。__block
つまり、列挙を通過するたびに無条件に変数を設定して、stop
早期終了に使用するときに「最後の」値になると期待してはいけません。「いいえ、このオブジェクトを使用する」は常にと組み合わせる必要がありますstop = YES;
。