【问题标题】:In Swift, how to search in a dictionary composed by an array of a struct object?在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?
【发布时间】:2020-09-11 18:07:23
【问题描述】:

我有一个结构:

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) {

【问题讨论】:

    标签: swift uitableview filter uisearchbar


    【解决方案1】:

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

    简单来说,解决方法是:

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

    【讨论】:

      【解决方案2】:

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

      var filteredData = [AlimentObject]()
      

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-28
          • 2016-03-11
          • 2017-08-27
          • 2014-09-06
          • 2014-07-26
          • 2023-03-17
          • 2018-07-17
          相关资源
          最近更新 更多