NSEnumerator
列挙子クラス
解説
「列挙子」と呼ばれるコレクションクラスの一つです。
継承 | NSObject |
準拠 | NSFastEnumeration |
NSObject (NSObject) | |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0 以降 |
iOS 2.0 以降 | |
定義 | NSEnumerator.h |
概要
Objective-C 2.0ではより高速な高速列挙と呼ばれる機能を使うことができます。
また、Blocksを使い繰り返し処理を行うメソッドがあるクラスもあります。
作成
allocで作成することはなく、NSArrayの-reverseObjectEnumeratorや-objectEnumeratorなどで返されたオブジェクトを使用します。
他には...
Foundation
NSDictionaryのkeyEnumerator、objectEnumerator
NSSetのobjectEnumerator
NSCountedSetのobjectEnumerator
NSHashTableのobjectEnumerator
NSMapTableのkeyEnumerator、objectEnumerator
AppKit
NSTableViewのselectedColumnEnumerator、selectedRowEnumerator
各要素を一つづつ取り出し、各要素に対して処理を行うための列挙子と呼ばれるオブジェクトを表すクラスです。
NSArray,NSDictionary,NSSetの各要素にあるメソッドでNSEnumeratorを作成して、forループ内でNSEnumeratorのメソッド-nextObjectを使って各要素を一つづつ取り出して処理を行います。
NSEnumeratorオブジェクトから要素を取り出すと、その要素はNSEnumeratorオブジェクトから取り除かれます。
全部の要素を取り出した後のNSEnumeratorオブジェクトは空になっているので-nextObjectメソッドを送信するとnilが返されます。
NSMutableArrayやNSMutableDictionaryなどの可変のオブジェクトからNSEnumeratorオブジェクトを作成した場合、列挙中に各要素を変更することは避けたほうが良いでしょう。公式ドキュメントにも現在は機能する場合もあるが、将来保障されないと表記されています。
Objective-C 2.0からは、より高速なNSFastEnumerationプロトコルが使えるようになりNSEnumeratorクラスを使う機会は減っています。
iOS4.0からはBlocks構文を使った処理がNSArrayなどにメソッド(– enumerateObjectsUsingBlockなど)が追加されましたので、NSEnumeratorクラスを使って繰り返し処理を行う機会は減っています。
列挙子の生成
他のコレクションオブジェクトのメソッドで作成します。
-objectEnumerator(NSArray)
-reverseObjectEnumerator(NSArray)
-keyEnumerator(NSDictionary)
-objectEnumerator(NSDictionary)
-objectEnumerator(NSSet)
メソッドとプロパティ
未列挙のすべての要素を取得します
- allObjects
まだ列挙されていない要素をすべて配列で返します。
列挙された要素はNSEnumeratorオブジェクトから取り除かれるので、未列挙の要素だけが返されるのです。
このメソッドを呼び出すとすべての要素がNSEnumeratorオブジェクトから取り除かれますので、このあと-nextObjectメソッドを呼び出してもnilが返されます。
次の要素を返します。
– nextObject
NSEnumeratorオブジェクトの要素を一つづつ取り出すためにこのメソッドを呼び出します。
-(void)method002 { NSArray *anArray = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd",nil]; id obj; NSEnumerator *aEnumerator; aEnumerator = [anArray objectEnumerator]; while ((obj = [aEnumerator nextObject]) != nil) { NSLog(@"%@",(NSString *)obj); } }