Вы можете сделать:
NSPredicate *p = [NSPredicate predicateWithFormat:@"attributeA contains[cd] $A OR attributeB contains[cd] $A or attributeC contains[cd] $A"];
NSDictionary *sub = [NSDictionary dictionaryWithObject:searchString forKey:@"A"];
p = [p predicateWithSubstitutionVariables:sub];
Или вы могли бы сделать что-то более странное, например:
- (NSPredicate *)buildOrPredicate:(NSDictionary *)stuff {
NSMutableArray *subs = [NSMutableArray array];
for (NSString *key in stuff) {
NSString *value = [stuff objectForKey:stuff];
NSPredicate *sub = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", key, value];
[subs addObject:sub];
}
return [NSCompoundPredicate orPredicateWithSubpredicates:subs];
}
А затем вызовите это с помощью:
NSDictionary *stuff = [NSDictionary dictionaryWithObjectsAndKeys:
searchString, @"attributeA",
searchString, @"attributeB",
searchString, @"attributeC",
nil];
NSPredicate *p = [self buildOrPredicate:stuff];
Единственное, о чем я могу подумать, это может сработать, это попытаться использовать позиционные определения в формате предиката. Однако я не знаю, распознает ли их синтаксический анализатор так же, как +stringWithFormat:
:
NSPredicate *p = [NSPredicate predicateWithFormat:@"attributeA contains[cd] %1$@ OR attributeB contains[cd] %1$@ or attributeC contains[cd] %1$@", searchString];