NSArrayのenumerateObjectsUsingBlockメソッド
配列データに該当の値が存在するか調べる際に配列データをループして調べるが、
今までは
for (int i = 0; i < array.count; i++) //一般的な方法
for (id obj in array) //高速列挙
を使用していた。
NSArrayにはenumerateObjectsUsingBlockメソッドがあり便利なので記述する。
@interface ViewController () @property (nonatomic, strong) NSMutableArray *array; @end @implementation ViewController - (NSMutableArray *)array { NSMutableArray *array = [NSMutableArray array]; [array addObject:@"a"]; [array addObject:@"b"]; [array addObject:@"c"]; [array addObject:@"d"]; return array; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self.array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) { NSLog(@"obj:%@", obj); NSLog(@"idx:%d", idx); NSLog(@"stop:%d", *stop); if ([obj compare:@"b"] == NSOrderedSame) { //フラグをYESにしてループを終了させる *stop = YES; } }]; } @end
[出力ログ]
obj:a
idx:0
stop:0
obj:b
idx:1
stop:0
上記結果になる。
enumerateObjectsUsingBlockの第一引数に配列データ、第二引数に何番目のデータなのかを表す数値データ、第三引数にループを終了するか判定するフラグとなる。
フラグの初期値はNOなので配列データ内から該当するデータを探してあて、何かしらの処理を終えたらフラグをYESに書き換えることでループが終了する。
inを使った高速列挙では何番目のデータなのかといった数値は自身でNSUInteger countのように変数を用意しループ内でインクリメントする必要があったがenumerateObjectsUsingBlockを使えばそれが不要になる。