web-dev-qa-db-ja.com

NSPredicateを使用して配列を含む配列を検索する

Cardオブジェクト(NSObjects)の配列があり、それぞれにtagsというフィールドがあります。これはNSStringのNSArrayです。

次に、ユーザーの検索用語をkeywordsという文字列の配列にcomponentsSeparatedByStringで分割し、NSPredicateを使用して、少なくとも1つを含むタグを持つ要素に基づいてカードの配列をフィルタリングします。 keywordsのキーワード。

それがあまり複雑ではないことを願っています! NSPredicate IN句を使用してみましたが役に立ちませんでした。どうすればよいですか?

20
quantum

arrayにカードオブジェクトが含まれていることを考慮してください。

 NSArray *keyWordsList = [keywords componentSeparatedByString:@","];
 [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K IN %@",@"tags",keyWordsList]]

編集:

部分的に検索するには、LIKE演算子を使用できます。

[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K LIKE[cd] %@",@"tags",[partialkeyWord stringByAppendingString:@"*"]]]
60
Vignesh

これが正確に正しくない場合でも私を殺さないでください、しかしこのようなものはうまくいくでしょう。

NSArray* arrayOfCards = [NSArray array];
NSArray* keywords = [NSArray array];
NSPredicate* containsAKeyword = [NSPredicate predicateWithBlock: ^BOOL(id evaluatedObject, NSDictionary *bindings) {
    Card* card = (Card*)evaluatedObject;
    NSArray* tagArray = card.tags;
    for(NSString* tag in tagArray) {
       if( [keywords containsObject: tag] ) 
          return YES;
    }

    return NO;
}];

NSArray* result = [arrayOfCards filteredArrayUsingPredicate: containsAKeyword];
9
Paul de Lange