Първо отказ от отговорност:
Мисля, че това, което се опитвате да направите, е да добавите известна "размитост" към вашия алгоритъм за търсене, виждайки, че искате да направите вашето съвпадение нечувствително към определени разлики в потребителското въвеждане.
Предикатите (които са логически конструкции) по своята същност не са размити, така че има основно несъответствие на импеданса между проблема и избрания инструмент.
Както и да е, един от начините да го направите може да бъде да добавите метод към вашия модел обектен клас.
При този метод можете да изчистите низа на името си, така че да съдържа само най-основните знаци, да речем числа, ASCII букви и интервал.
Тъй като е напълно детерминиран, такъв метод е ефективно свойство на низ само за четене на вашия обект и като такъв може да се използва за съпоставяне в предикати.
Ето една реализация, която премахва пунктуацията, ударенията и диакритичните знаци:
- (NSString *)simplifiedName
{
// First convert the name string to a pure ASCII string
NSData *asciiData = [self.name dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *asciiString = [[[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding] lowercaseString];
// Define the characters that we will allow in our simplified name
NSString *searchCharacters = @"0123456789 abcdefghijklmnopqrstuvwxyz";
// Remove anything else
NSString *regExPattern = [NSString stringWithFormat:@"[^%@]", searchCharacters];
NSString *simplifiedName = [asciiString stringByReplacingOccurrencesOfString:regExPattern withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, asciiString.length)];
return simplifiedName;
}
Сега може да се направи предикат за търсене в опростеното име:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.simplifiedName = %@", searchString];
Вие, разбира се, бихте искали да почистите низа за търсене, като използвате същия алгоритъм, използван за почистване на името, така че вероятно би било добра идея да го включите в общ метод, който да се използва и на двете места.
И накрая, методът simplifiedName
може също да бъде добавен чрез внедряване на категория към класа на моделния обект, така че да не се налага да модифицирате неговия код, което е удобно в случай, че вашият клас на обект е дефиниран в автоматично генериран файл от Core Data.
person
Monolo
schedule
17.06.2012
searchText = [searchText stringByTrimmingCharactersInSet:characterSet]
илиsearchText = [searchText stringByReplacingOccurrencesOfString:@"," withString:@""]
трябва да направят. - person cdelacroix   schedule 16.06.2012