Objective-C
iOS

NSPredicateで絞り込みやindexを取得するで🤜🤛

NSPredicateで絞り込みやindexを取得するで🤜🤛

Objective-C にはNSPredicateという配列の絞り込みに便利なクラスがあります。
普通の使い方は検索したら結構載っているので
今回は普通の使い方+あまり他で載っていない使い方をご紹介します。
気まぐれでたまに他のパターンも増やすかも。

絞り込み元になるDictionaryの配列

.m
- (NSArray *)array
{
    return @[@{@"fruit":@"りんご"},
             @{@"fruit":@"パイナップル"},
             @{@"fruit":@"いちご"},
             @{@"fruit":@"りんご"},
             @{@"fruit":@"ぶとう"},
             @{@"fruit":@"りんご"},
             @{@"fruit":@"オレンジ"},
             @{@"fruit":@"さくらんぼ"},
             @{@"fruit":@""},
             @{@"fruit":[NSNull null]}];
}

普通に絞り込む

.m
- (void)hoge
{
    NSArray *fruitArray = [self array];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K= %@",@"fruit",@"りんご"];
    NSArray *filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
    NSLog(@"%@",filterArray);
    /* logの出力結果
     (
     {fruit = "りんご";},
     {fruit = "りんご";},
     {fruit = "りんご";}
     )
     */

     predicate = [NSPredicate predicateWithFormat:@"%K = %@ OR %K = %@",@"fruit",@"りんご",@"fruit",@"パイナップル"];
     filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
     NSLog(@"%@",filterArray);
     /* logの出力結果
      (
      {fruit = "りんご";},
      {fruit = "パイナップル";},
      {fruit = "りんご";},
      {fruit = "りんご";}
      )
      */

}

Indexを取得する

.m
- (void)hoge
{
    NSArray *fruitArray = [self array];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@",@"fruit",@"オレンジ"];
    NSUInteger index = [fruitArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
        return [predicate evaluateWithObject:obj];
    }];
    if (index != NSNotFound) {
        NSLog(@"該当するIndex:%ld",(long)index);
    }
    /* logの出力結果
     該当するIndex:6
     */
}

IndexSet(indexのリスト)を取得する

.m
- (void)hoge
{
    NSArray *fruitArray = [self array];
    NSIndexSet *indexSet = [fruitArray indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
        return [predicate evaluateWithObject:obj];
    }];

    NSLog(@"%@",indexSet);
    /* logの出力結果
     [number of indexes: 3 (in 3 ranges), indexes: (0 3 5)]
     */
}

文字数で絞り込む

.m
- (void)hoge
{
    // 3文字で絞る
    NSArray *fruitArray = [self array];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K.length = 3",@"fruit"];
    NSArray *filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
    NSLog(@"%@",filterArray);
    /* logの出力結果
     (
     {fruit = "りんご";},
     {fruit = "いちご";},
     {fruit = "りんご";},
     {fruit = "ぶどう";},
     {fruit = "りんご";}
     )
     */

    // 空文字以外(NULLは含まれる)
    predicate = [NSPredicate predicateWithFormat:@"%K.length != 0",@"fruit"];
    filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
    NSLog(@"%@",filterArray);
    /* logの出力結果
     (
     {fruit = "りんご";},
     {fruit = "パイナップル";},
     {fruit = "いちご";},
     {fruit = "りんご";},
     {fruit = "ぶどう";},
     {fruit = "りんご";},
     {fruit = "オレンジ";},
     {fruit = "さくらんぼ";},
     {fruit = "<null>";}
     )
     */

    // 空文字とNULL以外
    predicate = [NSPredicate predicateWithFormat:@"%K.length != 0 AND %K != NULL",@"fruit",@"fruit"];
    filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
    NSLog(@"%@",filterArray);
    /* logの出力結果
     (
     {fruit = "りんご";},
     {fruit = "パイナップル";},
     {fruit = "いちご";},
     {fruit = "りんご";},
     {fruit = "ぶどう";},
     {fruit = "りんご";},
     {fruit = "オレンジ";},
     {fruit = "さくらんぼ";}
     )
     */

}

あいまい検索で絞り込み

.m
- (void)hoge
{
    // *レン* であいまい検索
    NSArray *fruitArray = [self array];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE %@",@"fruit",[NSString stringWithFormat:@"*%@*",@"レン"]];
    NSArray *filterArray = [fruitArray filteredArrayUsingPredicate: predicate];
    NSLog(@"%@",filterArray);
    /* logの出力結果
     (
     {fruit = "オレンジ";}
     )
     */
}