评估NSArray上的NSPredicate(无过滤)

时间:2011-10-18 10:16:02

标签: objective-c cocoa nsarray nspredicate

是否可以在NSArray上评估NSPredicate,而不让NSPredicate开始过滤掉数组中的对象?

例如,假设我有以下谓词只检查数组中的对象数:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"count == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];

这会崩溃,因为pred将尝试从数组中的第一个对象而不是数组本身检索“count”键。

3 个答案:

答案 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"];

@countsimple 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;
}

希望,这有帮助。