在更新以下示例中的通用结构数组[SelectableItem]
时遇到问题。
Quick 40 seconds video screencast with a problem.
所以我有一个UITableView
,数据源为[SelectableItem]
。第一次初始化此数组时,我在其中指定名称和所选状态时,表视图正确显示了数据。但是,当我尝试选择SelectableItem
并将isSelected
的布尔状态切换为true并重新加载数据时,当单元格尝试时,源SelectableItem
isSelected
属性仍然是false
可以通过相同的getModelAt
函数获得它。
protocol Selectable {
var isSelected: Bool { get set }
}
struct SelectableItem: Selectable {
var isSelected: Bool
let name: String
}
func getModelAt(_ indexPath: IndexPath) -> T {
return isSearchActive ? searchResults[indexPath.item] : models[indexPath.item]
}
@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
if var model = strongDataSource?.getModelAt(indexPath) {
model.isSelected = !model.isSelected
tableView.reloadData()
}
}
在这行model.isSelected = !model.isSelected
上一切正常,我看到了模型的名称,以及model.isSelected
如何转换为另一个值(例如,从false变为true并由true变为false)。
我的假设是,当我使用结构而不是类时,也许我的getModelAt
通过数组中的值而不是引用中的值返回给我一个模型。但我不确定100%。也许Protocol get set
不确定了解我的问题是否有帮助,但是我使用此link来实现搜索功能,而我只是通过选择功能对其进行了扩展。因此,除了为结构实例的isSelected
属性分配新值之外,所有其他方法都工作正常。
答案 0 :(得分:1)
对于struct
分配意味着复制和更改它不会影响主要参考
if var model = strongDataSource?.getModelAt(indexPath) {
因此您需要将SelectableItem
设为班级