最初の免責事項:
あなたがやろうとしているのは、検索アルゴリズムに「あいまいさ」を追加することだと思います.ユーザー入力の特定の違いに反応しないように一致させたいと考えています.
述語 (論理構成体) は、その性質上ファジーではないため、問題と選択したツールとの間に根本的なインピーダンスの不一致があります。
とにかく、それを行う 1 つの方法は、モデル オブジェクト クラスにメソッドを追加することです。
この方法では、名前の文字列を消去して、数字、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 によって自動生成されたファイルでオブジェクト クラスが定義されている場合に便利です。