hachinoBlog

hachinobuのエンジニアライフ

配列からNSPredicate条件を使ってデータを抽出する方法

NSArrayからNSPredicateを使ってデータを抽出するにはNSArrayのfilteredArrayUsingPredicateメソッドを使う。

単純な例

NSArray array = @[@"a", @"b", @"c"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:"SELF = a"];
NSArray result = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", result) //a

あるクラスのインスタンスを条件にしてマッチするオブジェクトを抽出したい場合

//自作クラス
@interface Person : NSObject 

@property (nonatomic, copy) NSString *name;

@end

@implementation Person

- (void)dealloc
{
    [_name release];
}

@end

//実装
Person person1 = [[Person alloc] init];
person1.name = @"hachi";
Person person2 = [[Person alloc] init];
person2.name = @"nobu";

NSArray array = @[person1, person2];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"name", @"hachi"];
NSArray result = [array filteredArrayUsingPredicate:predicate]; //これで該当の条件にマッチするオブジェクトが取れる


2014/01/27追記
自作オブジェクトのカラムでなくメソッドの結果データから抽出する方法

//自作クラス
@interface Person : NSObject 

@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;

//firstName + lastName
- (NSString *)fullName;

@end

@implementation Person

- (NSString *)fullName
{
    return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}

- (void)dealloc
{
    [_firstName release];
    [_lastName release];
    [super dealloc]
}

@end

//実装
Person person1 = [[Person alloc] init];
person1.firstName = @"Ichiro";
person1.lastName = @"Suzuki";

Person person2 = [[Person alloc] init];
person2.firstName = @"hachi";
person2.lastName = @"nobu";

NSArray array = @[person1, person2];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"fullName", @"Ichiro Suzuki"];
NSArray result = [array filteredArrayUsingPredicate:predicate]; //これで該当の条件にマッチするオブジェクトが取れる

predicateWithFormatで%Kのプレースフォルダにメソッド名を指定するだけ。