我正在尝试制作一个可重用的 UITableView。我将传入 item 和 UITableViewCell 的泛型。然而,当我尝试将单元格转换为 C 时出现错误,并且不知道如何解决此问题。
成员“reusableLoadMoreTableView”不能用于类型的值 '任何 SharedLoadMoreTableViewDelegate
';考虑使用通用的 代替约束
protocol SharedLoadMoreTableViewDelegate<T, C>
{
associatedtype T
associatedtype C: UITableViewCell
func reusableLoadMoreTableView(configure cell: C, for item: T)
}
class ReusableLoadMoreTableView<T, C: UITableViewCell>: UIView, UITableViewDelegate, UITableViewDataSource
{
private let tableView = UITableView()
private var items: [T] = []
var delegate: (any SharedLoadMoreTableViewDelegate<T, C>)?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier:"CustomTableViewCell", for: indexPath) as! C
if indexPath.row < items.count
{
delegate?.reusableLoadMoreTableView(configure: cell, for: items[indexPath.row])
}
return cell
}
}
正如编译器建议的那样,您应该将
SharedLoadMoreTableViewDelegate
视为通用约束而不是类型
protocol SharedLoadMoreTableViewDelegate<T, C>
{
associatedtype T
associatedtype C: UITableViewCell
func reusableLoadMoreTableView(configure cell: C, for item: T)
}
class ReusableLoadMoreTableView<LoadMoreT: SharedLoadMoreTableViewDelegate>: UIView, UITableViewDelegate, UITableViewDataSource
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
0
}
private let tableView = UITableView()
private var items: [LoadMoreT.T] = []
var delegate: LoadMoreT?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier:"CustomTableViewCell", for: indexPath) as! LoadMoreT.C
if indexPath.row < items.count
{
delegate?.reusableLoadMoreTableView(configure: cell, for: items[indexPath.row])
}
return cell
}
}
您的代码也无法在您使用的旧版本 swift 中编译。自从实施SE-0352以来,它将正确编译。我的建议是通过更新 XCode 版本或在您的计算机上安装较新的 swift 安装来更新您的 swift 版本,以匹配或超过 Swift 5.7