Swift实现UITableView数据搜索与行选择时类型不匹配错误求解
问题排查与解决方法
报错原因
核心为类型不匹配:你通过empList.filter()筛选得到的结果是[Employee]类型的员工对象数组,但你定义的searchedText是[String]类型的字符串数组,二者类型不一致无法直接赋值。
推荐解决方案(方案1:修改搜索结果数组类型,适配后续行选择需求)
该方案更合理,保留完整员工对象,方便后续点击行时获取全量员工信息执行业务逻辑:
- 修改
searchedText的定义,把字符串数组改为员工对象数组:
// 替换原代码 var searchedText = [String]() var searchedText = [Employee]()
- 修改
cellForRowAt中搜索状态下的赋值逻辑:
// 替换原代码 cell.lblTitle.text = searchedText[indexPath.row] cell.lblTitle.text = searchedText[indexPath.row].emp_name
- 修正搜索筛选逻辑,补充可选值解包,还可额外添加不区分大小写的搜索适配:
searchedText = empList.filter { // 解包emp_name,同时支持不区分大小写搜索 $0.emp_name?.range(of: searchText, options: .caseInsensitive) != nil }
可选解决方案(方案2:保持搜索结果为字符串数组)
如果你仅需要存储匹配到的员工姓名,不需要完整员工对象,可以把筛选结果映射为字符串数组:
直接把搜索赋值的代码修改为:
searchedText = empList .filter { $0.emp_name?.contains(searchText) ?? false } .compactMap { $0.emp_name } // 把员工对象转换为员工姓名,自动过滤空值
额外优化建议
- 尽量不要使用隐式解包的
[Employee]!定义empList,改为默认空数组var empList: [Employee] = []更安全,避免空值崩溃 - 搜索时可以增加判断:如果搜索框文本为空,直接退出搜索状态,避免不必要的筛选逻辑
内容的提问来源于stack exchange,提问作者Rakshit Kumar
相关产品推荐
相关产品推荐

