协议“ xxx”只能用作一般约束,因为它具有“自身”或相关类型要求

时间:2019-09-10 17:46:24

标签: ios swift swift-protocols

我想使用自定义委托/数据源方法创建自定义 val sourcePath = Paths.get("C:/Users/DGH/Pictures/TestImages/test.txt"); val targetPath = Paths.get("C:/Users/DGH/Pictures/TestOutputImages/test.txt"); Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); 。我还想在传递数据源的类型时这样做。这是我尝试过的:

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() } } 声明行出现错误:

  

协议“ TestTableViewDelegate”只能用作通用约束,因为它具有“自我”或关联的类型要求

我不太了解这里发生了什么。这是什么意思,我该如何解决?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您需要处理迅速的通用且简单的方法是删除“关联”类型。

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()
    }

}