在Swift中,如何在由结构对象数组组成的字典中进行搜索?
我有一个结构:在Swift中,如何在由结构对象数组组成的字典中进行搜索?,swift,uitableview,filter,uisearchbar,Swift,Uitableview,Filter,Uisearchbar,我有一个结构: struct AlimentObject { var id = UUID().uuidString var nomAliment = "Nouvel aliment" var poids : Float = 100 var calories : Float = 0 } 以及由AlimentObjet组成的阵列: var filteredData: [AlimentObject]! 我有一
struct AlimentObject {
var id = UUID().uuidString
var nomAliment = "Nouvel aliment"
var poids : Float = 100
var calories : Float = 0
}
以及由AlimentObjet组成的阵列:
var filteredData: [AlimentObject]!
我有一个表格视图的搜索栏,我不知道如何在“nomAliment”中搜索字符
以下是搜索栏的代码:
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredData = []
for aliment in data {
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
filteredData.append(aliment)
}
}
self.tableView.reloadData()
}
}
错误显示:类型“()->String”不能符合“StringProtocol”;只有结构/枚举/类类型才能符合协议
这就行了:
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
在第二个小写的之后,您缺少()
,因此您没有执行小写的函数并将返回的字符串传递到包含()
,而是传递了一个类型为“()->String”的函数
简单地说,解决办法是:
if aliment.nomAliment.lowercased().contains(searchText.lowercased()) {
此外,我建议使用功能性方法进行过滤
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
var filteredData = data.filter { $0.nomAliment.contains(searchText.lowercased()) }
self.tableView.reloadData()
}
首先,永远不要将筛选数据的数组声明为隐式展开可选数组,将其声明为非可选空数组
var filteredData = [AlimentObject]()
其次,正如其他答案已经描述了缺少的括号一样,filter
和range(of:
)使用不区分大小写
选项要比使用循环和小写每个项目有效得多
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
filteredData.removeAll()
} else {
filteredData = data.filter{$0.nomAliment.range(of: searchText, options: .caseInsensitive) != nil}
}
self.tableView.reloadData()
}
}