2011-10-18 83 views
7

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

举例来说,假设我有以下谓词只是检查对象的数量在一个数组:

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

这会崩溃,因为预解码会尝试恢复“计数”从第一个对象键在数组中而不是数组本身。

+0

看来你必须用* list * not * @“123”*来评估。您可以使用与* NSArray *的* count *方法等效的SIZE运算符。 – EmptyStack

+0

你是对的,我只是修正了错字 – cfischer

回答

13

使用SIZE操作者的NSPredicate这相当于计数方法的NSArray

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

你为什么要经历这条相当迂回的路线?直接比较'count'到'3'即可。 –

+5

@Jacob Relkin,是的。这真的是最好的方式。但OP想知道为什么他的谓词不起作用,而不是最简单的方法来比较数组的数量;-) – EmptyStack

+0

谢谢。我用这个来过滤一个字典数组,通过删除其中包含一个键和空数组的条目。 –

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

希望,它帮助。

9

在你的谓词格式字符串中使用[SIZE]另一种方法是做到这一点:

NSPredicate *p = [NSPredicate predicateWithFormat:@"@count = 3"]; 

@countsimple collection keypath operators之一,是非常有用的。使用它比[SIZE]更常见,虽然两者都很好。