Swift 协议 - 属性 类型子类

Swift Protocol - Property type subclass

我正在定义一个名为 PanelController 的协议,我想在其中存储一个 PanelViewPanelView本身是UIView的子类,定义了panel的基本结构。我有三个不同的视图子类 PanelViewLeftPanelMidPanelRightPanel。对于这些面板中的每一个,我想定义一个符合 PanelController 协议的 xxxPanelController(左、中、右)。

我 运行 遇到的问题在协议中 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 的子类,所以它应该可以正常工作!但事实并非如此!

有人可以向我解释这是为什么吗?如果有人能想出一个可能的解决方法?谢谢!

问题出在协议中的 setter。

假设您想从 LeftPanelController 获取 panelView。没关系,因为 LeftPanelView 可以做 PanelView 可以做的一切(甚至更多)。

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

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

var panelView: PanelView = LeftPanelView()

这意味着您将无法访问特定于 LeftPanelView 的任何方法或属性,除非先对其进行转换。如果这不是问题,那么这应该可以解决您的问题!