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
相关产品推荐
相关产品推荐

