尝试使用通用 UITableViewCell 时出错

问题描述 投票:0回答:1

我正在尝试制作一个可重用的 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
      }
    
  }
ios swift uitableview generics
1个回答
0
投票

正如编译器建议的那样,您应该将

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

© www.soinside.com 2019 - 2024. All rights reserved.