使用NSSet过滤NSArray时使用NONE时出现故障

时间:2012-10-20 05:49:46

标签: cocoa nsarray nsset

我正在尝试通过排除NSSet中的元素来过滤NSArray。我正在做这样的事情:

    NSMutableArray* a = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];
    NSSet* set = [NSSet setWithObjects:@"2", nil];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE SELF IN %@", set];
    NSArray* b = [a filteredArrayUsingPredicate:predicate];

但是,此代码抛出异常:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'ALL或ANY运算符的左侧必须是NSArray或NSSet

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您应该在谓词中使用NOT而不是NONE

[NSPredicate predicateWithFormat:@"NOT SELF IN %@", set]

这是因为谓词应用于数组中的每个对象(SELF),即NSString。相反,None应该应用于NSArray的{​​{1}}。

如果您坚持使用NSSet。您可以将NONE更改为

a

以便NSMutableArray* a = [NSMutableArray arrayWithObjects:@[@"1"], @[@"2"], @[@"3"], nil]; 成为SELF