2012-04-10 8 views
7

Necesito usar NSPredicate para que coincida con dos cadenas, insensible a mayúsculas y minúsculas, diacrítica insensible, e insensible al espacio en blanco.NSPredica que ignora espacios en blanco

El predicado sería algo como esto:

[NSPredicate predicateWithFormat:@"Key ==[cdw] %@", userInputKey]; 

El modificador 'w' es un inventada para expresar lo que me gustaría usar.

No puedo simplemente recortar userInputKey porque los valores "Clave" de la fuente de datos también pueden tener espacios en blanco (necesitan esos espacios en blanco, no puedo recortarlos de antemano).

Por ejemplo, dado un userInputKey "abc", el predicado debe coincidir con

{"abc", "a b c", " a B C "}
y así sucesivamente. Dado un userInputKey "a B C", el predicado también debe coincidir con todos los valores en el conjunto anterior.

Esto no puede ser tan difícil de hacer, ¿o sí?

Respuesta

11

¿Qué hay de definir algo como esto:

+ (NSPredicate *)myPredicateWithKey:(NSString *)userInputKey { 
    return [NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedString, NSDictionary *bindings) { 
     // remove all whitespace from both strings 
     NSString *strippedString=[[evaluatedString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""]; 
     NSString *strippedKey=[[userInputKey componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""]; 
     return [strippedString caseInsensitiveCompare:strippedKey]==NSOrderedSame; 
    }]; 
} 

Entonces utilizar de esta manera:

NSArray *testArray=[NSArray arrayWithObjects:@"abc", @"a bc", @"A B C", @"AB", @"a B d", @"A  bC", nil]; 
NSArray *filteredArray=[testArray filteredArrayUsingPredicate:[MyClass myPredicateWithKey:@"a B C"]];    
NSLog(@"filteredArray: %@", filteredArray); 

El resultado es:

2012-04-10 13:32:11.978 Untitled 2[49613:707] filteredArray: (
    abc, 
    "a bc", 
    "A B C", 
    "A  bC" 
) 
+0

que tenían para buscar http: // stackoverflow .com/questions/3543208/nsfetchrequest-and-predicatewithblock porque quería usar el predicado con NSFetchRequest, pero aparte de eso, su solución n funcionó maravillosamente ¡Gracias! – JiaYow

Cuestiones relacionadas