2009-07-22 17 views
9

Obecnie mam następujący fragment koduPisanie NSPredicate która zwraca true, jeśli warunek nie jest spełniony

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

ta zwraca tablicę z elementami, które zawierają „-”. Chcę zrobić odwrotność tego, więc wszystkie elementy nie zawierające "-" są zwracane.

Czy to możliwe?

Próbowałem używać słowa kluczowego NOT w różnych lokalizacjach, ale bezskutecznie. (Nie sądziłem, że to i tak zadziała, na podstawie dokumentacji Apple).

Czy jest możliwe dostarczenie predykatu z tablicą znaków, których nie chcę w elementach tablicy? (Tablica jest obciążeniem ciągów).

+0

Zmieniono tytuł, aby lepiej odzwierciedlał to pytanie jako pytanie. –

Odpowiedz

27

Nie jestem ekspertem od Celu C, ale documentation seems to suggest this is possible. Czy próbowałeś:

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

Dziękuję, służy mi prawo do nie czytania całego dokumentu. Jedyne miejsce, w którym nie próbowałem, nie było wcześniej! – JonB

+0

Cieszę się, że mogę pomóc. :) –

+0

+1, Sweeeeeeet! – EmptyStack

8

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.

Powiązane problemy