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

quhf5bfb  于 2023-08-02  发布在  Swift
关注(0)|答案(2)|浏览(123)

我有一个字符数组,当我搜索并输入“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()
}

字符串

92dk7w1h

92dk7w1h1#

您只需要添加.anchored选项。由于您使用的是.caseInsensitive,因此不需要调用lowercased()

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

字符串
.anchored意味着只有在字符串的开头才能通过检查。如果选项还包括.backwards,那么.anchored将意味着匹配必须在字符串的末尾。

vc9ivgsu

vc9ivgsu2#

您可以使用hasPrefix过滤数据。它将根据您在搜索栏中输入的文本筛选出数据。
替换以下行:

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

字符串
使用(区分大小写搜索)

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


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

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

相关问题