You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4.0中如何通过SearchBar过滤结构体数组?

嗨,我明白你现在的困扰——过滤字符串数组轻车熟路,但换成带多属性的结构体数组就卡壳了对吧?其实核心逻辑是通的,只是需要把判断对象从字符串变成结构体的每个属性,我给你捋清楚怎么实现:

结构体数组的SearchBar过滤实现方案

1. 先明确结构体的属性处理逻辑

首先假设你的dataStruct是类似这样的(如果有非String类型的属性,比如Int、Double,记得先转成String再做匹配判断):

struct dataStruct {
    let name: String
    let age: Int
    let address: String
}

2. 完善searchBar代理方法的过滤代码

在textDidChange代理方法里,我们需要遍历BaseArray中的每个结构体实例,检查它的所有属性是否和搜索文本匹配(建议做大小写不敏感匹配,提升用户搜索体验):

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // 处理搜索文本为空的情况:直接显示全部数据
    guard let inputText = searchBar.text, !inputText.isEmpty else {
        filteredArray = BaseArray
        yourTableView.reloadData() // 记得刷新你的列表UI
        return
    }
    
    // 核心过滤逻辑:检查结构体的每个属性是否匹配搜索文本
    filteredArray = BaseArray.filter { item in
        let lowercasedInput = inputText.lowercased()
        // 逐个检查属性,只要有一个匹配就保留该实例
        let nameMatches = item.name.lowercased().contains(lowercasedInput)
        let ageMatches = String(item.age).lowercased().contains(lowercasedInput)
        let addressMatches = item.address.lowercased().contains(lowercasedInput)
        
        return nameMatches || ageMatches || addressMatches
    }
    
    // 过滤完成后刷新列表
    yourTableView.reloadData()
}

3. 可选优化:让代码更整洁

如果你的结构体属性很多,重复写判断逻辑会很冗余,可以给结构体加个扩展方法,把匹配逻辑封装起来:

extension dataStruct {
    func isMatching(_ searchText: String) -> Bool {
        let lowercasedText = searchText.lowercased()
        return name.lowercased().contains(lowercasedText)
            || String(age).lowercased().contains(lowercasedText)
            || address.lowercased().contains(lowercasedText)
    }
}

这样过滤逻辑就能简化成一行,可读性更强:

filteredArray = BaseArray.filter { $0.isMatching(inputText) }

内容的提问来源于stack exchange,提问作者Brutus98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:50:49