94

私は辞書の配列を持っています。

キーに基づいて配列をフィルタリングしたい。

私はこれを試しました:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  %@)", @"Football"];

NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

これは機能しません。結果が得られません。私は何か間違ったことをしていると思います。「SPORT」がivarだった場合の方法だと思います。鍵だと違うと思います。

しかし、私は例を見つけることができませんでした。

ありがとう


アップデート

検索している文字列を引用符で囲みます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  '%@')", @"Football"];

それでも動作しません。


アップデート2

解決しました。私は実際に一重引用符を削除する必要がありましたが、これはガイドの説明に反しているようです。

私の本当の問題は、ネストされた配列があり、実際に辞書を評価していなかったことです。骨頭が動く。

4

6 に答える 6

151

それは機能するはずです-データ変数が実際にキーSPORTを持つ辞書を含む配列である限り

NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]];    
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]];

この場合のフィルタリングには、辞書が含まれます。

(%@ を引用符で囲む必要はありません。これは、NSPredicate がオブジェクトを作成するときに行われます。)

于 2009-06-06T00:18:57.500 に答える
27

私はそれが古いニュースであることを知っていますが、私の2セントを追加します. デフォルトでは、コマンドLIKE[cd]だけではなくコマンドを使用します[c]。は[d]文字をアクセント記号と比較します。これは、人々が自分の名前を「Vòódòó」と綴る私のWarcraftアプリで特にうまく機能し、テーブルビューで自分の名前を検索することはほとんど不可能です. は[d]、述語の中でアクセント記号を取り除きます。@"name LIKE[CD] %@", object.nameしたがって、 whereの述語は、 object.name == @"voodoo"Vòódòó という名前を含むオブジェクトを返します。

Apple のドキュメントから: like[cd] は「大文字と小文字を区別しないlike」を意味します) 。

于 2012-08-26T17:05:24.587 に答える
11
#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat:
        @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}
于 2013-08-01T19:09:44.393 に答える
3

NSPredicateiPhone 3.0 でのみ使用できます。

デバイスで実行しようとするまで、それに気付かないでしょう。

于 2009-06-06T12:23:22.713 に答える
-1

NSPredicate リファレンスを見ると、置換文字を引用符で囲む必要があるようです。たとえば、現在の述語は次のようになります: (SPORT == Football)You want it to read (SPORT == 'Football'), so your format string needs to be @"(SPORT == '%@')".

于 2009-06-06T00:13:15.907 に答える