如果符合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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...