można zbudować własny predykat negować predykat, które już masz. W efekcie, bierzesz istniejący orzecznik i owijając go w innym orzecznika, który działa podobnie jak operator nie:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF contains '-'"];
NSPredicate *notPred = [NSCompoundPredicate notPredicateWithSubpredicate:pred];
[resultsArray filterUsingPredicate:pred];
W NSCompoundPredicate klasy wspiera i, OR i NOT predykatywnych typów, więc można przejść i budować duży złożony predykat ze wszystkimi znakami, których nie chcesz w swojej tablicy, a następnie filtruj go. Spróbuj czegoś takiego:
// 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];
robię żadnych gwarancji co do jego skuteczności, choć i to chyba dobry pomysł, aby umieścić znaki, które są w stanie wyeliminować jak najwięcej ciągów z końcowej tablicy najpierw tak, że filtr może zwierać jak najwięcej porównań, jak to możliwe.
Zmieniono tytuł, aby lepiej odzwierciedlał to pytanie jako pytanie. –