忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【Objective-C】NSArrayの要素のフィルタリング

こんな配列があります。

    NSArray *numberStringArray = @[@"One", @"Two", @"Three", @"Four", @"Five"];

そのうち"T"から始まる要素だけ取得したい。
そんな時は。。。

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K beginsWith %@", @"self", @"T"];
    // predicateWithFormatに渡される値は「@"self beginsWith 'T'"」になる
    NSArray *numberStringArrayBeginWith_T = [numberStringArray filteredArrayUsingPredicate:predicate];
    NSLog(@"numberStringArrayBeginWith_T: %@", numberStringArrayBeginWith_T);

出力ログ

numberStringArrayBeginWith_T: (
    Two,
    Three
)

です!

続いて"e"を含む要素を取得したい。
そんな時は。。。

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains 'e'"];
    // 今回はpredicateWithFormatに直接文字列を渡してみました。
    NSArray *numberStringArrayWithContain_e = [numberStringArray filteredArrayUsingPredicate:predicate];
    NSLog(@"numberStringArrayWithContain_e: %@", numberStringArrayWithContain_e);

出力ログ

numberStringArrayWithContain_e: (
    One,
    Three,
    Five
)

デス!

要素が文字列でなく、数値だった場合。。。

    NSArray *numbersArray = @[@3, @18, @20, @7, @9, @10];
    NSLog(@"numbersArray: %@", numbersArray);
    
    // 10以上の要素を取得
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K >= %d", @"self", 10];
    NSArray *numbersArrayOver10 = [numbersArray filteredArrayUsingPredicate:predicate];
    NSLog(@"numbersArrayOver10: %@", numbersArrayOver10);

出力ログ

numbersArrayOver10: (
    18,
    20,
    10
)

こんな感じでNSPredicateを利用すると色々とデータの操作ができるそうです。 NSArrayだけでなく、NSSetでも同様の操作が可能です。

参考

『詳細! Objective-C iPhoneアプリ開発 入門ノート Xcode5+iOS7対応』

CoreData - NSPredicate 全構文解説 - Qiita