我正在定义一个名为PanelController的协议(protocol),我想在其中存储一个PanelViewPanelView本身是UIView的子类,它定义面板的基本结构。我有PanelView子类化的三种不同 View :LeftPanelMidPanelRightPanel。我想为每个面板定义一个符合xxxPanelController协议(protocol)的PanelController(左,中,右)。

我遇到的问题是协议(protocol)和xxxPanelController

protocol PanelController {
    var panelView: PanelView { get set }
    ...
}


class LeftPanelController: UIViewController, PanelController {
    var panelView = LeftPanelView()
    ...
}

在哪里
class LeftPanelView: PanelView {
     ...
}

和(最后一块...)
class PanelView: UIView {
    ...
}

我收到一个错误消息:明显原因是LeftPanelController does not conform to protocol PanelController:panelView的类型是LeftPanelView而不是PanelView。不过,这似乎真的仅限于我,因为LeftPanelViewPanelView的子类,因此它应该可以正常工作!但事实并非如此!

有人可以向我解释为什么会这样吗,如果有人可以提出一个可行的解决方法?谢谢!

最佳答案

问题出在协议(protocol)中的 setter 上。

假设您要从panelView获取LeftPanelController。很好,因为LeftPanelView可以完成PanelView可以做的所有事情(甚至更多)。

如果您想设置panelViewLeftPanelController,则可以给它任何PanelView。因为您将panelView变量定义为LeftPanelView,所以 setter 有时可能会失败。

要解决此问题,您可以在LeftPanelController中执行以下操作:

var panelView: PanelView = LeftPanelView()

这样做的含义是,如果不先转换LeftPanelView,就无法访​​问特定于ojit_code的任何方法或属性。如果这不是问题,那么这应该可以解决您的问题!

10-07 13:30