首先是免责声明:
我认为您要做的是为您的搜索算法添加一些“模糊性”,看到您想让您的匹配对用户输入的某些差异不敏感。
谓词(它们是逻辑结构)本质上并不模糊,因此问题和所选工具之间存在潜在的阻抗不匹配。
无论如何,解决它的一种方法可能是向您的模型对象类添加一个方法。
在这种方法中,您可以清理您的姓名字符串,使其仅包含最基本的字符,例如数字、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 自动生成的文件中定义的,这很方便。