如何在Swift中优雅地使用ReusableIdentifier

2025-05-19 11:17:24
推荐回答(1个)
回答1:

我们可以使用泛型定义一个ReusableIdentifier结构体,有一个identifier的不变量:
public struct ReusableIdentifier {
let identifier: String
init() {
identifier = String(T.self)
}
}
然后为UITableView实现一个register方法,这个方法只需要传入一个类型即可:
extension UITableView {
func register(_: T.Type) {
registerClass(T.self, forCellReuseIdentifier: ReusableIdentifier().identifier)
}
}
如此,注册的时候就非常简单:tableview.register(UITableViewCell.self)。
同样的,可以为UITableView实现一个dequeue方法:
@warn_unused_result
func dequeue(indexPath: NSIndexPath) -> T {
let rid = ReusableIdentifier()
guard let cell = dequeueReusableCellWithReuseIdentifier(rid.identifier, forIndexPath: indexPath) as? T else {
assertionFailure("No identifier(\(rid.identifier)) found for \(T.self)")
return T.init()
}
return cell
}
使用的时候只需要指定cell的类型,传入indexPath即可:
let cell: UITableViewCell = tableview.dequeue(indexPath)
通过引入一个结构体,利用泛型特性,不需要对已有的类型做任何修改,只需要替换注册和复用cell时调用的方法,我们就可以非常优雅的复用Tableview Cell。
参考上面的方法,我们可以借助ReusableIdentifier结构体,为UICollectionView实现相应的方法。