编写NSPredicate格式字符串以测试多个属性的更短方法?

时间:2011-06-10 11:47:43

标签: objective-c cocoa nspredicate

是否有一种更短的方法来为与此等效的谓词编写格式字符串:

[NSPredicate predicateWithFormat: @"key1 CONTAINS[cd] %@ OR key2 CONTAINS[cd] %@ OR key3 CONTAINS[cd] %@", searchString, searchString, searchString];

我已经编写了一些像这样的谓词格式字符串,我想通过编写一个采用关键路径数组和搜索字符串来构造这样一个谓词的方法来简化它。但在我这样做之前,我想我会问是否有内置方法可以做到这一点。

2 个答案:

答案 0 :(得分:6)

NSCompoundPredicateNSPredicate的子类,需要NSArrayNSPredicate个实例。但是,这意味着您仍然需要自己构建NSPredicate个对象(如果您愿意,可以构建子预测对象)。我的建议是编写自己的方法(按照您的计划),但使用NSCompoundPredicate,因为它是为此目的而设计的。

- (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;}

答案 1 :(得分:2)

我不相信有更短的路。另一种方法是使用NSCompoundPredicate的{​​{1}}方法。这几乎不会短,但可能不像连接字符串那样“无聊”。