2012-04-10 14 views
7

Devo utilizzare NSPredicate per far corrispondere due stringhe, senza distinzione tra maiuscole e minuscole, senza segno diacritico, e senza spazi bianchi.NSPredicate che ignora gli spazi bianchi

Il predicato sarebbe simile a questa:

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

Il modificatore 'w' è un inventata per esprimere quello che mi piacerebbe usare.

Non riesco a tagliare solo lo userInputKey perché i valori "Chiave" dell'origine dati potrebbero avere anche degli spazi bianchi (hanno bisogno di quegli spazi bianchi, non li posso tagliare prima).

Ad esempio, dato un userInputKey "abc" il predicato deve corrispondere a tutti

{"abc", "a b c", " a B C "}
e così via. Dato un userInputKey "a B C", il predicato dovrebbe anche corrispondere a tutti i valori nell'insieme sopra.

Questo non può essere così difficile da fare, vero?

risposta

11

Come sulla definizione qualcosa di simile:

+ (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; 
    }]; 
} 

Quindi utilizzare in questo modo:

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); 

Il risultato è:

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

ho dovuto occhiata http: // StackOverflow .com/questions/3543208/nsfetchrequest-and-predicatewithblock perché volevo utilizzare il predicato con NSFetchRequest, ma a parte questo, la tua solutio n ha funzionato magnificamente. Grazie! – JiaYow

Problemi correlati