Swift协议 – 属性类型子类

我正在定义一个名为PanelController的协议,我想在其中存储一个PanelViewPanelView本身是UIView的子类,定义了面板的基本结构。 我有三个不同的视图,它们是PanelView子类: LeftPanelMidPanelRightPanel 。 对于每个面板,我想定义一个符合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获取LeftPanelController 。 这没关系,因为LeftPanelView可以完成PanelView可以做的所有事情(以及更多)。

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

要解决此问题,您可以在LeftPanelController执行以下LeftPanelController

 var panelView: PanelView = LeftPanelView() 

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