在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()
    }
}