如何解决如果符合X的类是Hashable,如何将协议X的数组强制转换为“ Hashable”?
我也有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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。