在Swift中,如何在由struct对象数组组成的字典中进行搜索?

问题描述

我有一个结构:

id

以及由AlimentObjet组成的数组:

 from pyspark.sql.functions import Window

 w = Window.partitionBy('id').orderBy('val1')
 temp = df.withColumn('rn',row_number().over(w))
 

我有一个用于表格视图的搜索栏,并且我不知道如何搜索“ nomAliment”中的字符 这是searchBar的代码

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

错误提示:类型'()->字符串'不符合'StringProtocol';只有struct / enum / class类型可以符合协议 在一行中:

   var filteredData: [AlimentObject]!

解决方法

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

简单的解决方法是:

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:caseInsensitive)比使用循环和 lowercasing 每个项目。

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