我有一个带有实例变量的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”。我将不胜感激。
答案 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];
}