使用 ReusableKit swift 注册 UITableViewCell

时间:2021-02-23 09:47:25

标签: swift generics reusablekit

我正在尝试构建通用的 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) }
}

很酷的东西,但我不知道为什么会出现以下问题,即使 ListOptionTableCellSeperatorTableCell 继承自 UITableViewCell

enter image description here

注意:我使用 ReusableKit 来做到这一点。

1 个答案:

答案 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
        ]
    }
}

请注意,这是一个非常简单的类型擦除实现。有更复杂的方法可以实现这一点。

相关问题