NSPredicate の使い方

NSPredicate の話を求めて、このブログへ訪れる方が多いようなので、NSPredicate の使い方を紹介しようと思います。

NSPredicate は、NSArray で要素をフィルターするための条件を表したり、Core Data で取ってくるデータの条件を表すためのクラスです。

NSPredicate を作成する方法として最も簡単なものが、predicateWithFormat です。これを用いると、NSPredicate 独自の記法ではありますが、自然な記述で条件を書くことができます。

Predicate の条件式の基本形は、”keyPath operator literal” です。それぞれには、次のようなものが入ります。

keyPath
キー値コーディングのキーパス。この値が条件の判定に利用されます。self 指定すると、そのオブジェクト自体の値が利用されます。(selfもキー値コーディングです)
operator
比較演算子が入ります。数値であれば、=, < , >, < =, >= 等、文字列であれば =, contains, like, startsWith, endsWith, in 等が使用できます。
literal
定数値を入れます。キーパスとの比較に用いられます。数値は直接書き、文字列の場合は ‘ ‘ や ” ” で括ります。また、配列を { e0, e1, … } のような形式で記述できます。

また、メソッド名に Format があるように、NSLogと同様に書式指定子が使用できます。ただし、Predicate 用に追加されている書式指定子 %K があります。これは、keypath の部分を指定する書式指定子で、キーパスを入れるところには %@ ではなく、 %K を使うことに注意しなければなりません。

具体的な例を見れば、すぐにわかると思いますので、いくつかの例を示します。

NSArray *strings = [NSArray arrayWithObjects:@"first", @"second", @"third", nil];
NSPredicate *predicate;

// 単純な比較
predicate = [NSPredicate predicateWithFormat:@"self = 'first'"];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { first }

// 書式指定子を利用した比較
predicate = [NSPredicate predicateWithFormat:@"%K = %d", @"length", 5];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { first, third }

// in 演算子の利用と、配列のリテラル値の入力方法
predicate = [NSPredicate predicateWithFormat:@"self in %@", [NSArray arrayWithObjects:@"first", @"second", nil]];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { first, second }

// contains 演算子の利用
predicate = [NSPredicate predicateWithFormat:@"%K contains %@", @"self", @"i"];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { first, third }

// like演算子と1オプションの利用
predicate = [NSPredicate predicateWithFormat:@"%K like1 %@", @"self", @"FIRST"];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { first }

また、not, and, or 等の演算子を利用できます。

predicate = [NSPredicate predicateWithFormat:@"not ( 1 <= length and length <= 5 )"];
NSLog( @"%@", [strings filteredArrayUsingPredicate:predicate] );
// { second }

演算子やPredicateの作成方法は、他にもあります。詳しくは、Predicate Programming Guide を御覧ください。

参考資料
Predicate Programming Guide
NSPredicate Class Reference

コメント

  1. SKY より:

    ActiveBasicの進捗はどうなったのでしょう…。

  2. OverTaker より:

    > SKY
    私にもわからない状態です。本家が復活したら再開することにしていましたが、もはやそれも過去の話となりつつあります。気配を見せていないうちに、私のパソコン環境が完全にMacとなってしまったので、再開したとしても、私がABへ関与できるかわからないです。

コメント投稿