Domanda

Al momento ho il seguente pezzo di codice

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

Questo restituisce un array con gli elementi che contengono '-'. Voglio fare l'inverso di questo modo tutti gli elementi che non contiene '-'. Vengono restituiti

È possibile?

Ho provato con la parola chiave NOT in varie località, ma senza alcun risultato. (Non ho pensato che avrebbe funzionato in ogni caso, sulla base della documentazione di Apple).

Per portare avanti questo, è possibile fornire il predicato con una serie di caratteri che non voglio essere negli elementi dell'array? (La matrice è un carico di stringhe).

È stato utile?

Soluzione

Non sono un esperto di Objective-C, ma il documentazione sembra suggerire questo è possibile . Hai provato:

predicateWithFormat:"not SELF contains '-'"

Altri suggerimenti

È possibile costruire un predicato personalizzato per negare il predicato che hai già. In effetti, si sta prendendo un predicato esistente e avvolgendolo in un altro predicato che funziona come l'operatore NOT:

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

Il NSCompoundPredicate supporta la classe AND, OR e NOT tipi di predicato, così si potrebbe passare attraverso e costruire una grande predicato composto con tutti i personaggi che non si desidera nella propria matrice, poi filtrare su di esso. Provare qualcosa di simile:

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

faccio alcuna garanzia circa la sua efficienza, però, ed è probabilmente una buona idea di mettere i personaggi che sono in grado di eliminare il maggior numero di corde dalla matrice finale prima in modo che il filtro può corto circuito come molti paragoni possibili .

Mi piacerebbe recomment NSNotPredicateType come descritto nella Mela documentazione .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top