我正在尝试构建通用的 getAll
方法 will,它只返回可重用单元的实例。
通过创建,我不必手动注册单元格,我只需将其添加到数组中,然后在 registerCellsFromReusable()
中将其注册。
enum Reusable {
static let listOptionTableCell = ReusableCell<ListOptionTableCell>(nibName: "ListOptionTableCell")
static let seperatorTableCell = ReusableCell<SeperatorTableCell>(nibName: "SeperatorTableCell")
static func getAll<T>() -> [ReusableCell<T>] where T : UITableViewCell {
return [listOptionTableCell, seperatorTableCell]
}
}
override func viewDidLoad() {
super.viewDidLoad()
registerCellsFromReusable()
}
private func registerCellsFromReusable() {
Reusable.getAll().forEach { tableView.register($0) }
}
很酷的东西,但我不知道为什么会出现以下问题,即使 ListOptionTableCell
和 SeperatorTableCell
继承自 UITableViewCell
注意:我使用 ReusableKit 来做到这一点。
答案 0 :(得分:0)
我对 ReusableKit
框架没有深入了解,但为了使这项工作能够正常工作,您必须应用某种形式的类型擦除。 Swift 无法创建不同类型的正确类型集合(由于这里使用了泛型),因此我们必须找到一种类型,我们可以将它们转换为符合您需求的类型。在这种情况下,这将是 ReusableCell<UITableViewCell>
。我们只关心 ReusableCell 中的 T
最后继承自 UITableViewCell
。
// Create an extension on ReusableCell to type erase it
extension ReusableCell {
var asTypeErasedReusableCell: ReusableCell<UITableViewCell> {
ReusableCell<UITableViewCell>(nibName: nibName)
}
}
enum Reusable {
static let listOptionTableCell = ReusableCell<ListOptionTableCell>(nibName: "ListOptionTableCell")
static let seperatorTableCell = ReusableCell<SeperatorTableCell>(nibName: "SeperatorTableCell")
static func getAll() -> [ReusableCell<UITableViewCell>] {
[
listOptionTableCell.asTypeErasedReusableCell,
seperatorTableCell.asTypeErasedReusableCell
]
}
}
请注意,这是一个非常简单的类型擦除实现。有更复杂的方法可以实现这一点。