Swift协议继承和协议一致性问题

问题描述 投票:2回答:1
protocol BasePresenterProtocol : class {}
protocol DashboardPresenterProtocol : BasePresenterProtocol {}

final class DashboardPresenter {
    weak var view: DashboardPresenterProtocol?

    init() {
        self.view = DashboardViewController()
    }

    func test() {
        print("Hello")
    }
}

extension DashboardPresenter: DashboardViewProtocol { }

protocol BaseViewProtocol : class {
    weak var view: BasePresenterProtocol? { get set }
}

protocol DashboardViewProtocol : BaseViewProtocol {
}

class DashboardViewController {
}

extension DashboardViewController: DashboardPresenterProtocol { }

在上面的代码中,我在下一行收到错误

extension DashboardPresenter: DashboardViewProtocol { }

那,DashboardPresenter没有确认协议DashboardViewProtocol,但我已经在weak var view: DashboardPresenterProtocol?宣布DashboardPresenter。虽然我已经宣布了

为什么我收到此错误?请让我知道我在这段代码中做错了什么。

swift swift-protocols
1个回答
6
投票

您不能使用类型为BasePresenterProtocol?的属性实现类型为DashboardPresenterProtocol?的读写属性要求。

考虑如果可能会发生什么,并且你将DashboardPresenter的一个实例向上转换为DashboardViewProtocol。您可以将符合BasePresenterProtocol的任何内容分配给DashboardPresenterProtocol?类型的属性 - 这将是非法的。

出于这个原因,读写属性要求必须是不变的(尽管值得注意的是,只读的属性要求应该能够协变 - but this currently isn't supported)。

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