提问人:Mauriho Enrique Escurra Colqui 提问时间:7/20/2023 最后编辑:Nirmit DaglyMauriho Enrique Escurra Colqui 更新时间:7/20/2023 访问量:54
在 Swift 中使用 SearchBar 区分第一个字母而不是整个字符的搜索
Search that distinguishes the first letters and not the entire character with SearchBar in Swift
问:
我有一个字符数组,例如,当我搜索并输入“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()
}
答:
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
.caseInsensitive
lowercased()
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
另外,我还有一个问题要问你。
评论