【问题标题】:Replace Accent character with basic in a String - ą -> a , ć -> c用字符串中的基本字符替换重音字符 - ą -> a , ć -> c
【发布时间】:2020-07-02 16:08:51
【问题描述】:

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

我在我的 TableView 搜索控制器中使用它,大约有 15,000 个字符串。代码可以运行,但速度很慢,每输入一个字母,应用就会冻结一秒钟。

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

我的 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
    }
}

【问题讨论】:

  • 你的工作比你必须的要努力得多。 .folding 调用已经消除了您列出的所有变音符号,除了波兰语 ell。所以你只剩下一个字符需要替换了。

标签: swift string special-characters uisearchcontroller diacritics


【解决方案1】:

尝试range(ofcaseInsensitivediacriticInsensitive 选项

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

没有扩展

【讨论】:

  • 谢谢,适合大多数角色。我可以对波兰语“ł”做任何事情,因为上面没有包含。
  • 无需重新发明轮子
  • @LeoDabus 感谢您的提示,range(of也有一个等价物
【解决方案2】:

您可以使用localizedStandardContains,它返回一个布尔值,指示字符串是否包含给定的字符串,同时考虑当前的语言环境。

声明

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

讨论 这是进行用户级字符串搜索的最合适的方法,类似于系统中的一般搜索方式。 搜索是区域设置感知的,不区分大小写和变音符号。最正确 应用的搜索选项列表可能会随着时间而改变

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É"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2011-10-20
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多