Вы можете создать собственный предикат, чтобы свести на нет предикат, который у вас уже есть. По сути, вы принимаете существующий предикат и обернув его в другой предикат, который работает как оператор 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];
Я не делаю никаких гарантий в отношении ее эффективности, хотя, и это, вероятно, хорошая идея, чтобы поместить символы, которые, вероятно, чтобы устранить большинство строк из конечного массива первыми, так что фильтр может короткое замыкание, как можно больше сравнений.
Изменено название, чтобы лучше отразить то, что этот вопрос, как просить. –