1

我有一个 Car 类,其中包含“color”和“make”等实例变量。我需要一个允许我搜索颜色或品牌或两者的 NSPredicate。

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

该谓词要求同时存在颜色和品牌。如果用户只给出一种颜色,则不会返回任何结果,因为 make 将是“nil”。对于任何实例变量,没有汽车有 nil。

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

4

2 回答 2

3

您可以动态构建谓词格式以仅测试非零属性。更多关于这里。还可以考虑使您的搜索变音符号不敏感(在您的 CONTAINS 语句中添加“d”)。以“Škoda”为例。您希望人们也可以通过“斯柯达”找到它。

于 2012-10-11T17:41:15.430 回答
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];
}
于 2012-10-11T19:37:16.857 回答