NSPredicate:寻找更简单的代码

时间:2012-09-12 12:16:19

标签: objective-c

我不熟悉NSPredicate语法。以下代码行做了我想要的。但我想知道是否有更简洁的方法来做到这一点。

另外,非常感谢任何有关NSPredicate语法的备忘单。对于实际目的而言,关于NSPredicate的Apple文档在我看来要复杂得多。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name CONTAINS[cd] %@ OR SELF.city CONTAINS[cd] %@ OR SELF.state CONTAINS[cd] %@",aString, aString, aString];

2 个答案:

答案 0 :(得分:0)

你有什么好。我怀疑你有很多方法可以改善"或者为了这么简单的目的简化你的谓词。

答案 1 :(得分:0)

您可以使用NSPredicate的子类NSCompoundPredicate

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:
                               @[[NSPredicate predicateWithFormat:@"SELF.name CONTAINS[cd] %@", aString], 
                                 [NSPredicate predicateWithFormat:@"SELF.city CONTAINS[cd] %@", aString], 
                                 [NSPredicate predicateWithFormat:@"SELF.state CONTAINS[cd] %@", aString]
                                ]
                         ];

但是

  

«两个以上 - 使用一个» Edsger W. Dijkstra
  «或枚举» vikingosegundo

NSString *aString =@"Ney York";
NSMutableArray *predicates = [@[] mutableCopy];
[@[@"name", @"city", @"state"] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *format = [NSString stringWithFormat:@"SELF.%@ CONTAINS[cd] %%@", obj];
    [predicates addObject:[NSPredicate predicateWithFormat:format, aString]];
}];

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];