Swift协议 - 属性类型子类

Cla*_*lis 16 syntax protocols ios swift

我正在定义一个调用的协议PanelController,我想在其中存储一个PanelView.PanelView它本身是一个子类,UIView定义了面板的基本结构.我有一个子类三种不同的观点PanelView:LeftPanel,MidPanel,和RightPanel.对于每个面板,我想定义一个xxxPanelController符合PanelController协议的(左,中,右).

我遇到的问题是协议和 xxxPanelController

protocol PanelController {
    var panelView: PanelView { get set }
    ...
}
Run Code Online (Sandbox Code Playgroud)

class LeftPanelController: UIViewController, PanelController {
    var panelView = LeftPanelView()
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪里

class LeftPanelView: PanelView {
     ...
}
Run Code Online (Sandbox Code Playgroud)

和(最后一件......)

class PanelView: UIView {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说:LeftPanelController does not conform to protocol PanelController出于一个显而易见的原因:panelView类型LeftPanelView不是PanelView.这似乎真的仅限于我,因为它LeftPanelView是一个子类,PanelView所以它应该工作!但事实并非如此!

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

Eri*_*ric 7

问题在于协议中的setter.

比方说,你想要得到panelViewLeftPanelController.那很好,因为LeftPanelView可以做任何事情都PanelView可以做(以及更多).

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

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

var panelView: PanelView = LeftPanelView()
Run Code Online (Sandbox Code Playgroud)

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

  • 即使使用get-only属性,问题仍然存在. (6认同)