76

私は最近、高速列挙のニーズで多くのenumerateObjectsUsingBlock:を使用していましたが、列挙ブロックのBOOL *stopの使用法を理解するのは苦労しています。enumerateObjectsUsingBlockのBOOL * stop引数は何ですか?

NSArrayクラス基準状態

stop:ブール値を参照します。ブロックは、値をYES〜 に設定して、アレイの処理を停止することができます。 stop引数はout-only 引数です。 ブロック内でこのブール値をYESに設定する必要があります。

if (idx == [myArray indexOfObject:[myArray lastObject]]) { 
    *stop = YES; 
} 

私は明示的に持っていないYESから*stopを設定していない、言うことができました何から:

は、それではもちろん私は、列挙を停止するには、私のブロックに以下を追加することができますいかなる副作用もありません。列挙は、配列の終わりに自動的に停止するようです。だからブロック内で実際には*stopを使用していますか?

答えて

143

ブロックへの引数stopは、を早期にの列挙を停止させることができます。これは通常のforループのbreakに相当します。配列内のすべてのオブジェクトを調べたい場合は、無視することができます。

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; 
     } 
    } 
} 
+20

「stop」フラグはアドバイザリであることに注意してください。例えば、並行した場合には、いくつかの未定義の反復回数について列挙を継続することができる。私。列挙を通過するたびに '__block'変数を無条件に設定して、' stop'を使って早期に終了するときには 'last '値にすることを期待してはいけません。 "いいえ、このオブジェクトを使用する"と 'stop = YES; 'を設定することで常に結合する必要があります。 – bbum

+0

@bbum、継続的な動作が並行列挙に_only_を適用するかどうかを明確にすることはできますか?その場合は完全に理解できますが、それは文書化されておらず、「シリアル」列挙のためのかなりの驚きの一口でしょう。 –

+3

は、ドキュメンテーションがいずれの方法でも言及していないため、説明を求めるようになりました。 – bbum

関連する問題