Swift 将字符串中的重音字符替换为basic-ą-&燃气轮机;a,x107 ;-&燃气轮机;C

Swift 将字符串中的重音字符替换为basic-ą-&燃气轮机;a,x107 ;-&燃气轮机;C,swift,string,special-characters,uisearchcontroller,diacritics,Swift,String,Special Characters,Uisearchcontroller,Diacritics,在数据库中搜索时,我正在删除波兰字母表中的重音字符。这样用户就可以不带重音地键入文本 我在我的TableView搜索控制器中使用了大约15000个字符串。代码可以工作,但速度非常慢,每输入一个字母,应用程序就会冻结一秒钟 有没有人有更有效的解决方案 TableView的我的过滤器: //My old method which didn't convert accent letters and works smoothly var arr = dataSetArray.filter({$0.low

在数据库中搜索时,我正在删除波兰字母表中的重音字符。这样用户就可以不带重音地键入文本

我在我的TableView搜索控制器中使用了大约15000个字符串。代码可以工作,但速度非常慢,每输入一个字母,应用程序就会冻结一秒钟

有没有人有更有效的解决方案

TableView的我的过滤器:

//My old method which didn't convert accent letters and works smoothly
var arr = dataSetArray.filter({$0.lowercased().contains(searchText.lowercased())})

//My new filtering method
var arr = dataSetArray.filter({$0.forSorting().contains(searchText.lowercased())})
我的分机号码:

extension String {
func forSorting() -> String {
    let set = [("ą", "a"), ("ć", "c"), ("ę", "e"), ("ł", "l"), ("ń", "n"), ("ó", "o"), ("ś", "s"), ("ź", "z"), ("ż", "z")]
    let ab = self.lowercased()
    let new = ab.folding(options: .diacriticInsensitive, locale: nil)
    let final = new.replaceCharacters(characters: set)
    return final
    }
}

extension String {
    func replaceCharacters(characters: [(String, String)]) -> String
    {
        var input: String = self
        let count = characters.count
        if count >= 1
        {
            for i in 1...count
            {
                let c = i - 1
                let first = input
                let working = first.replacingOccurrences(of: characters[c].0, with: characters[c].1)
                input = working
            }
        }
        return input
    }
}
使用
不区分大小写的
区分字母敏感的
选项尝试
范围(of

let arr = dataSetArray.filter{ $0.localizedStandardRange(of: searchText) != nil }

在没有扩展名的情况下,可以使用localizedStandardContains,它返回一个布尔值,指示字符串是否包含给定字符串,并考虑当前区域设置

声明

func localizedStandardContains<T>(_ string: T) -> Bool where T : StringProtocol


您的工作比必须的要努力得多。
.folding
调用已经消除了您列出的所有变音符号,除了波兰语ell。因此您只剩下一个字符需要替换。谢谢,对大多数字符都很有效。我能为波兰语“ł”做些什么,因为这不包括在上述内容中。无需重新设计wheel@LeoDabus感谢您的提示,还有一个等效的
范围(of
extension Collection where Element: StringProtocol {
    public func localizedStandardFilter(_ element: Element) -> [Element] {
        filter { $0.localizedStandardContains(element) }
    }
}
let array = ["cafe","Café Quente","CAFÉ","Coffe"]
let filtered = array.localizedStandardFilter("cafe")

filtered  // ["cafe", "Café Quente", "CAFÉ"]