繁体   English   中英

Swift协议 - 属性类型子类

[英]Swift Protocol - Property type subclass

我正在定义一个名为PanelController的协议,我想在其中存储一个PanelView PanelView本身是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。

比方说,你想要得到的panelViewLeftPanelController 这没关系,因为LeftPanelView可以完成PanelView可以做的所有事情(以及更多)。

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

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

var panelView: PanelView = LeftPanelView()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM