hachinoBlog

hachinobuのエンジニアライフ

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を使えばそれが不要になる。


参考URL
http://www.zero4racer.com/blog/766