在Swift中,如何在struct对象数组组成的字典中查找?

In Swift, how to search in a dictionary composed by an array of a struct object?

我有一个结构:

struct AlimentObject {
        var id = UUID().uuidString
        var nomAliment = "Nouvel aliment"
        var poids : Float = 100
        var calories : Float = 0
}

和AlimentObjet组成的数组:

   var filteredData: [AlimentObject]!

我有一个 table 视图的搜索栏,但我不知道如何搜索“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';只有 struct/enum/class 类型可以符合协议 它在行中:

if aliment.nomAliment.lowercased().contains(searchText.lowercased) {

您在第二个 lowercased 之后缺少 (),因此您没有执行 lowercased 函数并将返回的字符串传递给 contains(),而是传递在类型为 '() -> String' 的函数中。

简单来说,解决方案是:

if aliment.nomAliment.lowercased().contains(searchText.lowercased()) {

此外,我建议使用函数式过滤方法

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    var filteredData = data.filter { [=10=].nomAliment.contains(searchText.lowercased()) }
    
    self.tableView.reloadData()
}

首先,永远不要将过滤数据的数组声明为隐式解包可选,将其声明为non-optional空数组

var filteredData = [AlimentObject]()

其次——因为其他答案已经描述了缺少的括号——filterrange(of:) 使用 caseInsensitive 选项比使用循环和 [=19] 更有效=]小写 每一项。

extension AjoutAlimentController: UISearchBarDelegate {
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       if searchText.isEmpty {
          filteredData.removeAll()
       } else { 
          filteredData = data.filter{[=11=].nomAliment.range(of: searchText, options: .caseInsensitive) != nil}
       }
        self.tableView.reloadData()
    }
}