Swift如何实现不区分变音符号的字符串contains()匹配?
解决Swift中越南语无变音符号搜索问题
你遇到的stringByFoldingWithOptions错误,是因为这是Objective-C里NSString的方法,Swift的String对应的API是folding(options:locale:)。下面是实现无变音符号匹配的具体方案:
步骤1:实现去除变音符号的辅助函数
先写一个工具函数,统一处理字符串的变音符号和大小写:
func normalizeString(_ str: String) -> String { // 转小写后去除变音符号,指定越南语Locale保证处理准确 return str.lowercased().folding(options: .diacriticInsensitive, locale: Locale(identifier: "vi_VN")) }
步骤2:修改过滤逻辑
把原来的过滤代码替换成以下逻辑,对用户输入和数组元素都做归一化处理后再判断包含关系:
let userInput = searchViewModel.text let normalizedInput = normalizeString(userInput) if !normalizedInput.isEmpty { filteredDictionary = dictionaryStrings.filter { phrase in let normalizedPhrase = normalizeString(phrase) return normalizedPhrase.contains(normalizedInput) } }
说明
- 用
.diacriticInsensitive选项可以去除所有变音符号(包括越南语的重音、声调符号),比如把"chân"转成"chan"。 - 指定
vi_VN的Locale是为了更精准处理越南语的特殊字符,避免其他语言规则干扰。 - 统一对输入和数组元素做归一化,不管用户输入带不带变音符号,都能匹配到对应的短语。
内容的提问来源于stack exchange,提问作者nhershy
相关产品推荐
相关产品推荐

