Frage

Im Moment habe ich das folgende Stück Code

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

Das gibt einen Array mit den Elementen, die ‚-‘ enthalten. Ich mag die Inverse, dies zu tun, so dass alle Elemente nicht enthalten ‚-‘. Zurückgegeben

Ist das möglich?

Ich habe versucht, an verschiedenen Orten des Schlüsselwort NOT verwenden, aber ohne Erfolg. (Ich glaube nicht, es trotzdem funktionieren würde, basierend auf der Apple-Dokumentation).

Um dies zu fördern, ist es möglich, das Prädikat mit einer Reihe von Zeichen zu schaffen, ich will nicht in den Elementen des Arrays sein? (Das Array ist eine Last von Strings).

War es hilfreich?

Lösung

Ich bin kein Objective-C-Experte, aber die Dokumentation scheint darauf hinzudeuten dies möglich . Haben Sie versucht:

predicateWithFormat:"not SELF contains '-'"

Andere Tipps

Sie können ein benutzerdefiniertes Prädikat bauen das Prädikat zu negieren, die Sie bereits haben. In der Tat sind Nehmen Sie ein vorhandenes Prädikat und es in einem anderen Prädikat Einwickeln, die wie der NOT-Operator funktioniert:

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

Die NSCompoundPredicate Klasse unterstützt AND, OR und NOT Prädikat Typen, so dass Sie durch und bauen eine große Verbindung Prädikat mit allen Zeichen gehen könnten Sie dann gefiltert werden es nicht in Ihrem Array wollen. Versuchen Sie so etwas wie:

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

Ich mache keine Garantien in Bezug auf seine Effizienz, aber, und es ist wahrscheinlich eine gute Idee, um die Zeichen zu setzen, die die meisten Saiten aus der letzten Reihe beseitigen wahrscheinlich zuerst so, dass die Filter kann Kurzschluss, so viele Vergleiche wie möglich .

Ich würde recomment NSNotPredicateType wie in der Apple-Dokumentation .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top