2012-05-08 15 views
11

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

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

、彼らが渡されたキーは1ワードである場合、これは正常に動作します:色、名前、年齢。しかし、キーが複数の単語である場合、Person Age、Person Nameのようにキーが機能しない場合は機能しません。

基本的に、スペースを含むキーは機能しません。私は文字列のキーの周りに一重引用符を入れようとしました、ちょうど彼らが価値の面で行われているように、しかしそれはどちらもうまくいきませんでした。二重引用符も試しましたが、無駄です。

こちらにご相談ください。前もって感謝します。

+2

トライ%のKが - それはコアデータでの作業の罰金だ – user170317

+0

[動作しませんNSPredicateのフォーマット文字列](の可能性重複http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

答えて

16

動的キーを使用する場合は、%@の代わりに%Kトークンを使用する必要があります。また、値トークンの前後で引用符を使用したくない場合もあります。あなたの述語はvalueではなく、リテラル文字列@"%@"と同等かどうかをテストします。

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

これはPredicate Format String Syntax guideに記載されています。


編集:Anumアミンが指摘するように、+[NSString stringWithFormat:]は述語フォーマットを処理しません。代わりに[NSPredicate predicateWithFormat:@"%K == %@", key, value]が必要です。

+5

NSStringは%Kを正しく置き換えません。 '[NSPredicate predicateWithFormat:]'を使うべきです。下の私の答えを見てください。 – NightFury

+0

@AnumAmin:あなたは絶対に正しいです。 Bittuのコードを新しく作成するのではなく、 "修正"しようと思ったのです。私は彼が私の答えをそのまま受け入れたことにも驚いています。 –

+0

私はすでにNSPredicate predicateWithFormatを使用していました。NSStringを作成するための別のステートメントではなく、そのステートメントで簡単に行うことができました。私はコメントでそれを明確にすべきだったが、Anumはうまくいった: – Bittu

23

私にとって、ケビンの答えはうまくいかなかった。私が使用:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself 
     NSLog(@"predicate %@",predicateString); 
     filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]]; 
+0

家で遊んでいる人のために、オプションの '[cd]'はあなたに大文字と小文字を区別しない。 – smacdonald

関連する問題