NSPredicate可能匹配多个属性

时间:2012-10-11 10:58:26

标签: ios nspredicate

我有一个带有实例变量的Car类,例如“color”和“make”。 我需要一个NSPredicate,它允许我搜索颜色或制作或两者。

NSPredicate*predicate=[NSPredicate predicateWithFormat:@"(color contains[c] %@) AND (make contains[c] %@)", chosenColor,chosenMake];

这个谓词要求有一个颜色和一个品牌。如果用户仅提供颜色,则不会返回任何结果,因为make将为“nil”。任何实例变量都没有汽车没有。

此外,搜索将针对许多变量,不仅仅是颜色和制作,因此不需要if / case情况。是否有任何选项可以让我搜索“AND if NOT nil”。我将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以动态构建谓词格式,以仅测试非零属性。有关here的更多信息。还要考虑使您的搜索变音不敏感(在CONTAINS语句中添加'd')。以“Škoda”为例。你希望人们也能用“skoda”找到它。

答案 1 :(得分:2)

使用NSCompoundPredicate API非常简单:

NSString *chosenColor = ...;
NSString *chosenMake = ...;

NSMutableArray *subpredicates = [NSMutableArray array];

if (chosenColor != nil) {
  NSPredicate *p = [NSPredicate predicateWithFormat:@"color contains[cd] %@", chosenColor];
  [subpredicates addObject:p];
}

if (chosenMake != nil) {
  NSPredicate *p = [NSPredicate predicateWithFormat:@"make contains[cd] %@", chosenMake];
  [subpredicates addObject:p];
}

NSPredicate *final = nil;
if ([subpredicates count] > 0) {
  final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
}