列挙
列挙型は、オブジェクト - 通常コレクション - の要素を各々一度、順番に一つずつ連続的に操作するプロセスです。列挙はまた、反復(iteration) とも呼ばれています。オブジェクトを列挙するときには、通常1回にオブジェクト内の1つの要素を選択し、その上に、またはそれを使用して操作を実行します。オブジェクトは、通常、配列や集合などのコレクションです。概念的に最も単純なケースでは、以下の例に示すように、配列の内容を列挙するためにループする、標準的な C 言語の for を使用しています。
NSArray *array = // get an array; NSInteger i, count = [array count]; for (i = 0; i < count; i++) { id element = [array objectAtIndex:i]; /* code that acts on the element */ }
for ループを使用すると、しかしながら、非効率的であり、要素の順序付きコレクションを必要とします。列挙はより一般的です。Cocoa はそのため、オブジェクトを列挙する為の2つの追加の方法、 NSEnumerator クラスと高速列挙を提供しています。
NSEnumerator
コレクション・クラスを含むいくつかの Cocoa クラスは、インスタンスが保持している要素を回収できるように、順番に列挙型を提供するように求められます。
NSSet *aSet = // get a set; NSEnumerator *enumerator = [aSet objectEnumerator]; id element; while ((element = [enumerator nextObject])) { /* code that acts on the element */ }
しかし、一般に、NSEnumerator クラスの使用は高速列挙に取って代わられています。
高速列挙
コレクションクラスを含むいくつかの Cocoa クラスは、NSFastEnumeration プロトコルを採用しています。次の例に示すように、標準 C 言語の for ループと同様の構文を使用して、インスタンスが保持している要素を取得するために使用できます。
NSArray *anArray = // get an array; for (id element in anArray) { /* code that acts on the element */ }
名前が示すように、高速列挙は列挙型の他の形式よりも効率的です。
前提条件の記事
関連記事
既出の議論
最も効率的なコレクションの列挙テクニックを使用
次の章
前の章