libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

NSArray/NSMutableArrayとオブジェクトの配列 (6/6)

作成:2011-02-16 09:30
更新:2011-11-13 21:20

■NSArrayとイテレータ

NSArray/NSMutableArrayといった配列のためのクラスでは、「全要素について処理を行う」というような使い方をすることが良くあります。こうした場合、どういうやり方をするのが的確でしょうか。

まず、誰もが思いつくのは「forによる繰り返しでしょう。例えば、NSArrayにある全要素を取り出して処理するなら、こんな感じになるでしょう。
for(int i = 0;i < [《NSArray*》 count];i++){
    id 変数 = [《NSArray*》 objectAtIndex:i];
    ……変数を操作する処理……
}
これでもいいのですが、しかしNSArrayからオブジェクトを取り出すあたりの処理をプログラマが自分で定義しなければならない、というのはどうなんでしょう。それに、プログラマのやり方がまずければ、全部の要素をきちんと取り出せないケースも出てくるかも知れません。もっとシンプルに、全要素を扱うための方法があってもよさそうな気がしませんか。

最近のプログラミング言語では、こうした場合に「イテレータ」(列挙)と呼ばれる仕組みが導入されています。これは、多数の要素から順に値を取り出すための専用の機能のことです。Objective-Cでは、for構文を拡張し、「高速列挙」と呼ばれる機能が実装されています。これは、こんな感じで使います。
for ( 変数 in 《NSArray*》){
    ……変数に取り出したオブジェクトの処理……
}
forの後の()内に、NSArrayと、取り出したオブジェクトを保管する変数(id型などがいいでしょう)を用意します。これで、繰り返すごとにNSArrayから順にオブジェクトを取り出しては変数に設定していきます。構文として用意されているため、これを利用すれば必ずすべての要素を取り出すことが保証されます。

また、イテレータ用のクラスとして「NSEnumerator」というものも用意されています。これは、NSArrayなどと同じように多数のオブジェクトを自身の中に持ちますが、そこから順にオブジェクトを取り出していくための機能をもっています。

このNSEnumeratorは、NSArrayから以下のようにしてインスタンスを取り出します。
NSEnumerator* 変数 = [《NSArray*》 objectEnumerator];
NSEnumerator* 変数 = [《NSArray*》 reverseObjectEnumerator];
objectEnumeratorはそのままの並び順でオブジェクトを取り出すためのインスタンスを取得します。reverseObjectEnumeratorは、逆順に取り出すためのインスタンスを取得します。――こうして取り出したNSEnumeratorでは、「nextObject」というものを使って順にオブジェクトを取り出していくことができます。
while (変数 = [《NSEnumerator*》 nextObject]) {
    ……変数を操作する処理……
}
こんな具合にすれば、NSEnumeratorから順にオブジェクトを変数に取り出すことができます。そしてすべての要素を取り出したらそのまま繰り返しを抜けてくれます。

以下に、2通りのイテレータ利用法のサンプルをあげておきました。全要素を利用するのに、イテレータは非常に役立ちます。なにより、「必ず全要素をきちんと取り出し処理できる」というのが心強いですね!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableArray* arr = [NSMutableArray
               arrayWithObjects:@"Hello",@"Welcome",@"Bye",nil];
        for(id obj in arr){
            NSLog(@"%@",obj);
        }
        NSEnumerator* enm = [arr reverseObjectEnumerator];
        id obj;
        while (obj = [enm nextObject]) {
            NSLog(@"%@",obj);
        }
    }
    return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る