问题
Is there a shorter way to write the format string for a predicate equivalent to this:
[NSPredicate predicateWithFormat: @"key1 CONTAINS[cd] %@ OR key2 CONTAINS[cd] %@ OR key3 CONTAINS[cd] %@", searchString, searchString, searchString];
I have written a few predicate format strings like this, and I was thinking to simplify that by writing a method that takes an array of key paths and the search string to construct such a predicate. But I thought I’d ask if there is a built-in way to do this, before doing that.
回答1:
NSCompoundPredicate
is a subclass of NSPredicate
and takes an NSArray
of NSPredicate
instances. However, this would mean that you still have to construct the NSPredicate
objects (the subpredicates if you will) yourself. My suggestion is to write your own method (as you are planning to) but use NSCompoundPredicate
as it is designed for this purpose.
- (NSPredicate *)predicateWithKeyPaths:(NSArray *)keyPaths andSearchTerm:(NSString *)searchTerm {
NSMutableArray *subpredicates = [[NSMutableArray alloc] init];
for (NSString *keyPath in keyPaths) {
NSPredicate *subpredicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", keyPath, searchTerm];
[subpredicates addObject:subpredicate];
}
NSPredicate *result = [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates];
[subpredicates release];
return result;}
回答2:
I don't believe there is a shorter way. An alternative is to use NSCompoundPredicate
's orPredicateWithSubpredicates:
method. That's hardly shorter, but probably not as "boring" as having to concatenate strings.
来源:https://stackoverflow.com/questions/6305940/shorter-way-to-write-nspredicate-format-string-for-testing-multiple-properties