为带JSON数据的TableViewCell加搜索栏遇类型赋值错误求助
解决搜索栏过滤时的类型不匹配错误
首先,这个报错Cannot assign value of type '[Item]' to type '[String]'的核心原因很明确:你用来存储搜索结果的数组类型和过滤后得到的[Item]类型不兼容——大概率你定义了一个[String]类型的过滤数组(比如var filteredItems: [String] = []),但搜索过滤操作返回的是Item对象的数组,自然没法直接赋值。
下面是具体的修复步骤:
1. 修正过滤数组的类型
把你的过滤数组改成和原数组items一样的[Item]类型:
var items = [Item]() var filteredItems: [Item] = [] // 这里要定义成[Item],而不是[String] let searchBar = UISearchBar()
2. 编写正确的搜索过滤函数
在搜索栏文本变化的代理方法里,基于Item的属性(比如name或symbol)进行过滤,返回[Item]类型的结果:
extension YourTableViewController: UISearchBarDelegate { func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // 如果搜索文本为空,就显示全部数据;否则过滤匹配的Item if searchText.isEmpty { filteredItems = items } else { filteredItems = items.filter { item in // 匹配name或者symbol,忽略大小写 item.name.lowercased().contains(searchText.lowercased()) || item.symbol.lowercased().contains(searchText.lowercased()) } } // 刷新表格显示结果 tableView.reloadData() } }
3. 确保TableView数据源使用过滤数组
在TableView的数据源方法里,使用filteredItems来提供数据:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return filteredItems.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) let currentItem = filteredItems[indexPath.row] // 给cell赋值,比如显示name和symbol cell.textLabel?.text = currentItem.name cell.detailTextLabel?.text = currentItem.symbol return cell }
4. 别忘了设置搜索栏代理
在视图加载时,记得把搜索栏的代理设置为当前控制器:
override func viewDidLoad() { super.viewDidLoad() searchBar.delegate = self // 初始化时让filteredItems等于全部数据 filteredItems = items }
这样就能解决类型不匹配的问题,搜索功能也能正常工作啦。
内容的提问来源于stack exchange,提问作者Akshay Jain
相关产品推荐
相关产品推荐

