Protocol 'xxx' 只能用作泛型约束,因为它有 Self 或关联类型要求

Protocol 'xxx' can only be used as a generic constraint because it has Self or associated type requirements

我想使用自定义 delegate/dataSource 方法创建自定义 UITableView。我还想在这样做时传递数据源的类型。这是我尝试过的:

struct TestModel {
    var name: String
}

protocol TestTableViewDelegate: UITableViewDelegate {    
    associatedtype CellModel        
    func cell(model: CellModel, path: IndexPath) -> UITableViewCell        
}

class TestTableView: UITableView {        
    var testDelegate: TestTableViewDelegate?        
}

class VCTest: UIViewController, TestTableViewDelegate {       

    typealias CellModel = TestModel    
    var t: TestTableView!

    override func viewDidLoad() {
        t.testDelegate = self
    }

    func cell(model: TestModel, path: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }

}

我在 testDelegate 声明行遇到错误:

Protocol 'TestTableViewDelegate' can only be used as a generic constraint because it has Self or associated type requirements

我不太明白这是怎么回事。这是什么意思,我该如何解决?

感谢您的帮助。

您需要处理 swift 通用且简单的方法是删除 Associate 类型。

protocol TestTableViewDelegate: UITableViewDelegate {
    func cell<T>(model: T, path: IndexPath) -> UITableViewCell
}

class TestTableView: UITableView {
    var testDelegate: TestTableViewDelegate?
}

class VCTest: UIViewController, TestTableViewDelegate {

    func cell<TestModel>(model: TestModel, path: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }

    var t: TestTableView!

    override func viewDidLoad() {
        t.testDelegate = self
    }
}

另一种测试方式(不确定结果):

class TestTableView<TestTableViewDelegate>: UITableView {
    var testDelegate: TestTableViewDelegate?
}

class VCTest: UIViewController, TestTableViewDelegate {

    typealias CellModel = TestModel
    var t: TestTableView<Any>!

    override func viewDidLoad() {
        t.testDelegate = self
    }

    func cell(model: TestModel, path: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }

}