Swift协议 – 属性类型子类
我正在定义一个名为PanelController
的协议,我想在其中存储一个PanelView
。 PanelView
本身是UIView
的子类,定义了面板的基本结构。 我有三个不同的视图,它们是PanelView
子类: LeftPanel
, MidPanel
和RightPanel
。 对于每个面板,我想定义一个符合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
。 这似乎真的限于我,因为LeftPanelView
是PanelView
的子类,所以它应该工作! 但事实并非如此!
有人可以向我解释为什么会这样,如果有人能想出一个,可能的解决方法? 谢谢!
问题在于协议中的setter。
假设你想从LeftPanelController
获取LeftPanelController
。 这没关系,因为LeftPanelView
可以完成PanelView
可以做的所有事情(以及更多)。
如果你想设置panelView
的LeftPanelController
,你可以给它任何PanelView
。 因为您将panelView
变量定义为LeftPanelView
,所以setter有时会失败。
要解决此问题,您可以在LeftPanelController
执行以下LeftPanelController
:
var panelView: PanelView = LeftPanelView()
这意味着您将无法访问任何特定于LeftPanelView
方法或属性,而无需先将其LeftPanelView
转换。 如果这不是问题,那么这应该可以解决您的问题!