22

私はクラスを持っており、クラスが NSFastEnumeration プロトコルに準拠していることを確認したいと考えています。ドキュメントを読みましたが、よくわかりません。プロトコルメソッドが何を返すべきか、またそれがどのように機能するか教えてもらえますか?

4

2 に答える 2

43

Apple のFastEnumerationSampleは何をすべきかを示していますが、ここでは内訳を示します。

唯一のNSFastEnumerationメソッドcountByEnumeratingWithState:objects:count:は、コレクションのチャンクを返します。0 を返すことによってそれ以上の項目がないことを示すまで、さらに項目が必要になるたびに実行されます。チャンクはids の C 配列として渡されます。

メソッド内で、stateパラメーターは、使用するデータのほとんど (すべてではないにしても) を保持します。を個別に呼び出すたびに設定state->itemsPtrおよび更新する必要があります。の各フィールドの簡単な説明は次のとおりです。state->statecountByEnumeratingWithState:objects:count:NSFastEnumerationState

  • state: 反復されるシーケンス内の位置を表します。インデックス付きコレクションの場合、これがインデックスになります。リンクされたリストの場合、これはノード ポインターである可能性があります。他の型の場合、これはより複雑な型になる可能性があります (たとえば、ツリーの場合、state->stateノードを格納するスタックとして使用される NSMutableArray になる可能性があります)。countByEnumeratingWithState:objects:count:が最初に呼び出されたときstate->stateは 0 です。この条件をチェックしてstate構造体を初期化します。
  • itemsPtr: チャンク内のアイテム。s のC 配列を指しidます。Cocoa はこの配列をループし、各項目を for-in ループで指定された変数に順番にバインドします。
  • mutationsPtr: 変更可能なコレクションの場合、 への最後の呼び出し以降にコレクションが変更されたことを示すために使用されますcountByEnumeratingWithState:objects:count:。通常、状態を初期化するときにこれを 1 回設定します。コレクション ミューテーターは、this が指す値をインクリメントします。Cocoa は、によって返されcountByEnumeratingWithState:objects:count:た値を前回の呼び出しからの値と比較します。それらが異なる場合、Cocoa は例外をスローします。
  • extra: これを使用して、追加のデータを保存できます。

state->stateの任意の要素を好きなように設定できstate->extraます。これらは便宜上のみ提供されており、Cocoa には影響しません。state->itemsPtrただし、*state->mutationsPtrメソッドによって返される値は Cocoa に影響します。

他の 2 つのメソッド パラメータについてstackbufは、項目を保持するために Cocoa が提供する配列です。その使用はオプションですが、使用しない場合は、state->itemPtr. 使用する場合は、呼び出しごとに設定state->itemsPtrします。は の長さで、その中に収納できるアイテムの最大数です。stackbuflenstackbuf

参考文献:

于 2011-02-02T09:16:00.093 に答える
3

優れた説明を見つけた後、このスレッドを復活させます。Apple リンクが壊れているようです。ここで試すことができます: https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html

私が見つけた高速列挙を実装するための最良の例は、http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.htmlです。それはそれよりもはるかに悪いように見えます。

于 2012-02-18T22:26:48.100 に答える