Сначала оговорка:
Я думаю, что вы пытаетесь добавить некоторую «нечеткость» в свой алгоритм поиска, поскольку вы хотите, чтобы ваше совпадение было нечувствительным к определенным различиям в пользовательском вводе.
Предикаты (которые являются логическими конструкциями) по своей природе не являются нечеткими, поэтому существует скрытое несоответствие импеданса между проблемой и выбранным инструментом.
В любом случае, одним из способов сделать это может быть добавление метода в класс объекта вашей модели.
В этом методе вы можете очистить строку имени, чтобы она содержала только самые основные символы, скажем, цифры, буквы 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