在 Swift 中使用 SearchBar 区分第一个字母而不是整个字符的搜索

Search that distinguishes the first letters and not the entire character with SearchBar in Swift

提问人:Mauriho Enrique Escurra Colqui 提问时间:7/20/2023 最后编辑:Nirmit DaglyMauriho Enrique Escurra Colqui 更新时间:7/20/2023 访问量:54

问:

我有一个字符数组,例如,当我搜索并输入“Co”时,我得到了两个匹配项(我不想要那个)。我只想搜索以特定字符开头的内容。

我在 Swift 中共享字符串数组和 textDidChange 方法

例如:

listEmployed = ["Conejo","Tetera","Aviteon","Sacoja"]
    
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    isSearching = true
    arrayFilterEmployed = listEmployed
    if searchText.isEmpty == false {
        arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})
    }
    
    if arrayFilterEmployed?.count == 0 {
        searchBar.showsCancelButton = false
        fountLabel?.isHidden = false
    }
    else {
        categoryTableView?.reloadData()
        fountLabel?.isHidden = true
    }
    categoryTableView?.reloadData()
}
iOS 数组 swift 字符串

评论


答:

1赞 Nirmit Dagly 7/20/2023 #1

对于您的情况,可以使用 hasPrefix 筛选数据。它将根据您在搜索栏中输入的文本过滤掉数据。

替换以下行:

arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})

with(区分大小写的搜索)

arrayFilterEmployed = listEmployed?.filter({$0.text.hasPrefix(searchText) != nil})

并替换为以下内容(不区分大小写的搜索)

arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().hasPrefix(searchText.lowercased()) != nil})

评论

0赞 Larme 7/20/2023
虽然 might 在大多数情况下都有效,但至少有一个奇点:“ß”,德语双“s”,eszett,这可能会导致错误的结果。lowercased()
0赞 Mauriho Enrique Escurra Colqui 7/21/2023
非常感谢大家的回复。这对我帮助很大。我能够解决我的问题。
2赞 HangarRash 7/20/2023 #2

您只需要添加该选项即可。由于您正在使用 ,因此您不需要调用:.anchored.caseInsensitivelowercased()

if !searchText.isEmpty {
    arrayFilterEmployed = listEmployed?.filter({$0.text.range(of: searchText, options: [.caseInsensitive, .anchored]) != nil})
}

.anchored表示只有在字符串开头时,检查才会通过。如果选项也包括 ,则表示匹配项必须位于字符串的末尾。.backwards.anchored

评论

0赞 Mauriho Enrique Escurra Colqui 7/21/2023
非常感谢伙计。我能够解决我的问题。现在随心所欲地搜索。谢谢。
0赞 Mauriho Enrique Escurra Colqui 7/21/2023
另外,我还有一个问题要问你。