是否可以在NSArray上评估NSPredicate,而不让NSPredicate开始过滤掉数组中的对象?
例如,假设我有以下谓词只检查数组中的对象数:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"count == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];
这会崩溃,因为pred将尝试从数组中的第一个对象而不是数组本身检索“count”键。
答案 0 :(得分:14)
使用 NSPredicate 的 SIZE 运算符,该运算符等同于 NSArray 的 count 方法。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[SIZE] == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];
答案 1 :(得分:9)
在谓词格式字符串中使用[SIZE]
的替代方法是:
NSPredicate *p = [NSPredicate predicateWithFormat:@"@count = 3"];
@count
是simple collection keypath operators中的一个,非常有用。使用它比[SIZE]
更常见,尽管两者都很好。
答案 2 :(得分:1)
例如,您可以使用所需的方法创建类别:
@interface NSPredicate (myCategory)
- (BOOL)evaluateWithArray:(id)array;
// other methods
@end
并在.m文件中实现它:
- (BOOL)evaluateWithArray:(id)array {
if ([array isKindOfClass:[NSArray class]])
return [self evaluateWithObject:array];
return NO;
}
希望,这有帮助。