需要帮助一个简单的谓词来匹配字符串中的任何单词到属性

时间:2011-06-28 02:57:55

标签: objective-c nspredicate

假设我想让用户使用对象的名称属性搜索我的对象。

如果用户只输入一个单词,我没有问题: 例如:面部

我的谓词是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", word]; 

但是,如果用户输入多个以空格分隔的单词,该怎么办? 我想做某事:

NSArray *words = [query componentsSeparatedByString:@" "];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] ANY %@", words]; 

但它不起作用。任何指导? 谢谢!

2 个答案:

答案 0 :(得分:1)

这样做的另一种方式(我刚刚从你的问题中学到了这一点)就是使用子查询。有关详细信息,请查看此SO question。您可以按以下方式使用子查询 -

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(%@, $str, SELF CONTAINS[cd] $str).@count != 0", words];

NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);

这似乎是有效的,因为我自己测试了它,但这也可能是奥术& Dave提到的模糊方式,因为它在谓词编程指南中没有提及。

可以找到SUBQUERY的格式here。它与您之前链接的问题中的链接相同。

答案 1 :(得分:0)

正如您在评论中提到的(正确),您可以通过构建复合谓词谓词来实现此目的,尽管您需要使用orPredicateWithSubpredicates,而不是and变体。

这真的是最好的方法。还有其他一些,但它们依赖于NSPredicate的更加神秘和模糊的用法,我真的建议使用构建复合谓词路径。