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所以它应该工作!但事实并非如此!
有人可以向我解释为什么会这样,如果有人能想出一个,可能的解决方法?谢谢!
问题在于协议中的setter.
比方说,你想要得到panelView的LeftPanelController.那很好,因为LeftPanelView可以做任何事情都PanelView可以做(以及更多).
如果你想设置panelView的LeftPanelController,虽然,你可以给它的任何PanelView.因为您将panelView变量定义为a LeftPanelView,所以setter有时会失败.
要解决此问题,您可以执行以下操作LeftPanelController:
var panelView: PanelView = LeftPanelView()
Run Code Online (Sandbox Code Playgroud)
这意味着,如果不LeftPanelView先将其强制转换,您将无法访问任何特定的方法或属性.如果这不是问题,那么这应该可以解决您的问题!