Reputation: 1420
I have an array of Card
objects (NSObjects), each with a field called tags
, which is an NSArray of NSStrings.
I would then like to split up the user's search term into an array called keywords
of strings by componentsSeparatedByString
, then use NSPredicate to filter my array of Cards based on which elements have tags containing at least 1 keyword in keywords
.
I hope that's not too convoluted! I've tried using the NSPredicate IN
clause to no avail. How should I do this?
Upvotes: 21
Views: 22524
Reputation: 10251
Considering array
contains card Object.
NSArray *keyWordsList = [keywords componentSeparatedByString:@","];
[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K IN %@",@"tags",keyWordsList]]
EDIT:
To search partially you can use LIKE operator.
[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K LIKE[cd] %@",@"tags",[partialkeyWord stringByAppendingString:@"*"]]]
Upvotes: 62
Reputation: 10633
Don't kill me if this isn't exactly right, but something like this will work.
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];
Upvotes: 9