12

NSDictionaryオブジェクトのNSArrayがあります。NSPredicateを使用して、辞書のキーに基づいて配列をフィルタリングしたいと思います。私はこのようなことをしています:

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate];

渡されたキーが1語(色、名前、年齢)の場合、これは正常に機能します。ただし、キーが複数の単語(Person Age、Person Nameなど)の場合は機能しません。

基本的に、スペースを含むキーは機能しません。値側で行われるのと同じように、文字列のキーを一重引用符で囲んでみましたが、それも機能しませんでした。また、二重引用符を試しましたが、役に立ちませんでした。

これについてアドバイスしてください。前もって感謝します。

4

2 に答える 2

23

私にとって、ケビンの答えはうまくいきませんでした。私が使用した:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself
        NSLog(@"predicate %@",predicateString);
        filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]];
于 2012-12-18T05:12:41.633 に答える
16

動的キーを使用する場合は、の%K代わりにトークンを使用する必要があります%@。また、値トークンを引用符で囲む必要はありません。@"%@"これにより、述語は、に対してではなく、リテラル文字列に対して等しいかどうかをテストしますvalue

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value];

これは、述語フォーマット文字列構文ガイドに記載されています。


編集:Anum Aminが指摘しているように、+[NSString stringWithFormat:]述語形式は処理しません。[NSPredicate predicateWithFormat:@"%K == %@", key, value]代わりに必要です。

于 2012-05-08T19:54:35.060 に答える