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

Posted

技术标签:

【中文标题】在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?【英文标题】:In Swift, how to search in a dictionary composed by an array of a struct object? 【发布时间】: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) 

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章

在由具有不同列名的 DataFrame 组成的字典中应用函数

C#WPF如何在由数据模板中的对象列表组成的列表框中设置项目[重复]

在 Swift 中使用 Alamofire 发送包含字典对象数组的字典对象时会发生奇怪的行为?

在 swift 中对动态键和动态对象使用 Codable

从嵌套结构(带有其他结构的数组)创建字典 Swift

将字典映射到 Swift 中的结构数组