私は最近、高速列挙のニーズのためにenumerateObjectsUsingBlock:
を頻繁に使用してきましたが、列挙ブロックでのBOOL *stop
の使用法を理解するのに苦労しています。
NSArray
クラス参照状態
stop
:ブール値への参照。ブロックは、値をYES
に設定して、配列のさらなる処理を停止できます。stop
引数は、出力専用の引数です。ブロック内でこのブール値をYES
にのみ設定する必要があります。
そのため、もちろん次のブロックを追加して列挙を停止できます。
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
私が伝えたことから、*stop
をYES
に明示的に設定しなくても、悪影響はありません。列挙は、配列の最後で自動的に停止するようです。ブロックで*stop
の使用は本当に必要ですか?
ブロックの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
sがフレームワークの呼び出しからコードに一般に返されるのと同じ方法。
- (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;
}
}
}