我正在定义一个名为PanelController
的协议(protocol),我想在其中存储一个PanelView
。 PanelView
本身是UIView
的子类,它定义面板的基本结构。我有PanelView
子类化的三种不同 View :LeftPanel
,MidPanel
和RightPanel
。我想为每个面板定义一个符合xxxPanelController
协议(protocol)的PanelController
(左,中,右)。
我遇到的问题是协议(protocol)和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
的子类,因此它应该可以正常工作!但事实并非如此!有人可以向我解释为什么会这样吗,如果有人可以提出一个可行的解决方法?谢谢!
最佳答案
问题出在协议(protocol)中的 setter 上。
假设您要从panelView
获取LeftPanelController
。很好,因为LeftPanelView
可以完成PanelView
可以做的所有事情(甚至更多)。
如果您想设置panelView
的LeftPanelController
,则可以给它任何PanelView
。因为您将panelView
变量定义为LeftPanelView
,所以 setter 有时可能会失败。
要解决此问题,您可以在LeftPanelController
中执行以下操作:
var panelView: PanelView = LeftPanelView()
这样做的含义是,如果不先转换
LeftPanelView
,就无法访问特定于ojit_code的任何方法或属性。如果这不是问题,那么这应该可以解决您的问题!