2009-07-22 3 views
9

настоящее время у меня следующий фрагмент кодаПишем NSPredicate, которая возвращает истину, если условие не выполнено

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

Это возвращает массив с элементами, которые содержат «-». Я хочу сделать обратное, так что все элементы, не содержащие '-', возвращаются.

Возможно ли это?

Я пытался использовать ключевое слово NOT в разных местах, но безрезультатно. (Я не думал, что это будет работать в любом случае на основе документации Apple).

Чтобы это сделать, можно ли предоставить предикат массиву символов, который я не хочу быть в элементах массива? (Массив - это загрузка строк).

+0

Изменено название, чтобы лучше отразить то, что этот вопрос, как просить. –

ответ

27

Я не специалист по Objective-C, а documentation seems to suggest this is possible. Вы пробовали:

predicateWithFormat:"not SELF contains '-'" 
+0

Спасибо, мне очень жаль, что я не прочитал документ целиком. Единственное место, где я не пробовал, не было раньше! – JonB

+0

Рад, что я мог помочь. :) –

+0

+1, Sweeeeeeet! – EmptyStack

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

Я не делаю никаких гарантий в отношении ее эффективности, хотя, и это, вероятно, хорошая идея, чтобы поместить символы, которые, вероятно, чтобы устранить большинство строк из конечного массива первыми, так что фильтр может короткое замыкание, как можно больше сравнений.

Смежные вопросы