问题描述
我也有TableView单元控制器遵循的协议:
protocol TableViewCellController {
func view(in tableView: UITableView) -> UITableViewCell
func cancelLoad()
func prefetch()
}
extension TableViewCellController {
func prefetch() { }
}
当我的表格视图呈现多种单元格类型时,每种类型的项目均作为其自己的控制器
final class ContentArticleTitleCellController: TableViewCellController {
private var cell: ContentArticleTitle?
func view(in tableView: UITableView) -> UITableViewCell {
cell = tableView.dequeueReusableCell()
return cell!
}
.....
}
final class ContentArticleSummaryCellController: TableViewCellController {
private var cell: ContentArticleSummary?
func view(in tableView: UITableView) -> UITableViewCell {
cell = tableView.dequeueReusableCell()
return cell!
}
.....
}
由于所有这些控制器均符合Hashable
,因此我想使用UITableViewDiffableDataSource
。
我可以像这样使用AnyHashable
创建数据源
func makeDataSource() -> UITableViewDiffableDataSource<Section,AnyHashable> {
return UITableViewDiffableDataSource(tableView: tableView) { tv,indexPath,controller -> UITableViewCell? in
guard let controller = controller as? TableViewCellController else { return nil }
return controller.view(in: tv)
}
}
我不确定如何将[TableViewCellController]
强制转换为[AnyHashable]
,因为TableViewCellController
不符合它,而是符合它的类。
我考虑过
func update(with items: [TableViewCellController],animate: Bool = true) {
let controllers = items.compactMap { $0 as? AnyHashable }
}
但是由于这些类型无关,所以总是会失败。
如果我尝试
let controllers = items.compactMap { $0 as? Hashable }
然后我击中generic constraint because it has Self or associated type requirements
我当然可以做类似的事情
let controllers = items.compactMap { $0 as? ContentArticleSummaryCellController }
但是,如果我有30种不同的单元控制器类型,则会变得混乱
我该如何实现?
解决方法
您对这种方法很了解:
let controllers = items.compactMap { $0 as? AnyHashable }
将其更改为:
let controllers = items.map(AnyHashable.init)