9

我目前有以下代码

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF contains '-'"];
[resultsArray filterUsingPredicate:pred];

这将返回一个包含“-”元素的数组。我想做与此相反的操作,以便返回所有不包含“-”的元素。

这可能吗?

我尝试在不同位置使用 NOT 关键字,但无济于事。(根据Apple文档,我认为它无论如何都不会起作用)。

为了进一步做到这一点,是否可以为谓词提供一个我不想出现在数组元素中的字符数组?(数组是一堆字符串)。

4

3 回答 3

28

我不是 Objective-C 专家,但文档似乎表明这是可能的。你有没有尝试过:

predicateWithFormat:"not SELF contains '-'"
于 2009-07-22T16:16:02.297 回答
8

您可以构建一个自定义谓词来否定您已有的谓词。实际上,您正在获取一个现有谓词并将其包装在另一个类似于 NOT 运算符的谓词中:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF contains '-'"];
NSPredicate *notPred = [NSCompoundPredicate notPredicateWithSubpredicate:pred];
[resultsArray filterUsingPredicate:pred];

NSCompoundPredicate类支持 AND、OR 和 NOT 谓词类型,因此您可以使用数组中不需要的所有字符构建一个大型复合谓词,然后对其进行过滤。尝试类似:

// Set up the arrays of bad characters and strings to be filtered
NSArray *badChars = [NSArray arrayWithObjects:@"-", @"*", @"&", nil];
NSMutableArray *strings = [[[NSArray arrayWithObjects:@"test-string", @"teststring", 
                   @"test*string", nil] mutableCopy] autorelease];

// Build an array of predicates to filter with, then combine into one AND predicate
NSMutableArray *predArray = [[[NSMutableArray alloc] 
                                    initWithCapacity:[badChars count]] autorelease];
for(NSString *badCharString in badChars) {
    NSPredicate *charPred = [NSPredicate 
                         predicateWithFormat:@"SELF contains '%@'", badCharString];
    NSPredicate *notPred = [NSCompoundPredicate notPredicateWithSubpredicate:pred];
    [predArray addObject:notPred];
}
NSPredicate *pred = [NSCompoundPredicate andPredicateWithSubpredicates:predArray];

// Do the filter
[strings filterUsingPredicate:pred];

不过,我不保证它的效率,最好将可能从最终数组中删除最多字符串的字符放在第一位,以便过滤器可以短路尽可能多的比较。

于 2009-07-22T16:17:07.490 回答
2

我会NSNotPredicateType按照Apple 文档中的说明进行推荐。

于 2014-12-30T12:58:54.117 回答