itok's Lab

昔の開発ネタを記録として残してます

NSArray にフィルタリング

CoreData に伴って導入された Predicate というクエリー言語。なにもデータベースにアクセスする時だけ使うのではなくて、NSArray から条件にあったものだけを抽出したりするのにも使えます。

// NSArray
-(NSArray*) filteredArrayUsingPredicate:(NSPredicate*)predicate

詳しくは、Predicate のドキュメントにたくさんサンプルがのっていますけれど、NSArray の要素そのもの(例えば NSString の配列とか)だけでなく、要素のさらに要素(つまり、NSDictionary の要素とか、KVC の要素とか)にまで条件を掘り下げることができるので便利です。

NSArray* arr = [NSArray arrayWithObjects:
    [NSDictionary dictionaryWithObjectsAndKeys:@"Tom", @"Name", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:@"Bob", @"Name", nil],
    nil];
// "Name" が "Tom" の要素だけを抽出
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Name=%@", @"Tom"];
NSArray* filteredArray = [arr filteredArrayUsingPredicate:predicate];
// => filteredArray ( { Name = Tom; } )