1. ホーム
  2. objective-c

[解決済み] enumerateObjectsUsingBlockとforの使い分けは?

2022-05-01 02:32:37

質問

明らかな違いの他に

  • 使用する enumerateObjectsUsingBlock インデックスとオブジェクトの両方が必要な場合
  • を使用しないでください。 enumerateObjectsUsingBlock ローカル変数を変更する必要がある場合 (これは私が間違っていました。bbumさんの回答を参照してください)

enumerateObjectsUsingBlock は、一般的に良くも悪くもないと考えられています。 for (id obj in myArray) も使えるのでしょうか?利点/欠点は何ですか(例えば、パフォーマンスが高いか低いか)?

解決方法は?

最終的には、使いたいパターンを使い、文脈の中でより自然になるようにします。

一方 for(... in ...) は非常に便利で、構文的にも簡潔です。 enumerateObjectsUsingBlock: には、面白いかどうかわからない機能がいくつもある。

  • enumerateObjectsUsingBlock: は、高速な列挙と同じかそれ以上に高速になります ( for(... in ...)NSFastEnumeration をサポートし、列挙を実装しています)。 高速な列挙を行うためには、内部表現から高速な列挙のための表現への変換が必要です。 そこにはオーバーヘッドがある。 ブロックベースの列挙では、コレクションクラスは、ネイティブのストレージフォーマットの最速のトラバーサルと同じくらい速くコンテンツを列挙することができます。 配列の場合は関係ないかもしれませんが、辞書の場合は大きな違いになります。

  • ローカル変数を変更する必要がある場合は、enumerateObjectsUsingBlock を使用しないでください。 __block で、ブロックの中で書き込み可能になります。

  • enumerateObjectsWithOptions:usingBlock: は、同時列挙と逆列挙のいずれかをサポートしています。

  • 辞書の場合、ブロックベースの列挙は、キーと値を同時に取得する唯一の方法である。

個人的には enumerateObjectsUsingBlock: よりも頻繁に for (... in ...) しかし、これも個人的な選択です。