2009-07-22 12 views
9

Actualmente tengo la siguiente pieza de códigoEscribir un NSPredicate que devuelve verdadero si no se cumple la condición

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

Esto devuelve una matriz con los elementos que contienen '-'. Quiero hacer lo contrario de esto para que todos los elementos que no contengan '-' sean devueltos.

¿Esto es posible?

He intentado utilizar la palabra clave NOT en varias ubicaciones, pero fue en vano. (No pensé que funcionaría de todos modos, según la documentación de Apple).

Para ampliar esto, ¿es posible proporcionar el predicado con una matriz de caracteres que no quiero que estén en los elementos de la matriz? (La matriz es una carga de cadenas).

+0

Título modificado para reflejar mejor lo que esta preguntaw como preguntar. –

Respuesta

27

No soy un experto en Objective-C, pero el documentation seems to suggest this is possible. Ha intentado:

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

Gracias, me sirve para no leer el documento en su totalidad. ¡El único lugar donde no probé no fue antes que yo! – JonB

+0

Me alegro de poder ayudar. :) –

+0

+1, Sweeeeeeet! – EmptyStack

8

Puede construir un predicado personalizado para negar el predicado que ya tiene. En efecto, usted está tomando un predicado existente y envolviéndolo en otro predicado que funciona como el operador NO:

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

Los soportes NSCompoundPredicate clase AND, OR y NOT tipos de predicado, por lo que podría pasar y construir un predicado compuesto grande con todos los caracteres que no quieres en tu matriz, luego filtra en él. Pruebe algo como:

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

hago ninguna garantía en cuanto a su eficacia, sin embargo, y es probable que sea una buena idea poner los caracteres que puedan eliminar la mayoría de las cadenas de la matriz final de primera para que el filtro puede cortocircuito tantas comparaciones como sea posible.

Cuestiones relacionadas