我正在定义一个名为 PanelController
的协议(protocol),我想在其中存储一个 PanelView
。 PanelView
本身是UIView
的子类,定义了面板的基本结构。我有三个不同的 View ,它们是 PanelView
的子类:LeftPanel
、MidPanel
和 RightPanel
。对于这些面板中的每一个,我想定义一个符合 PanelController
协议(protocol)的 xxxPanelController
(左、中、右)。
我遇到的问题是协议(protocol)和 xxxPanelController
protocol PanelController {
var panelView: PanelView { get set }
...
}
和
class LeftPanelController: UIViewController, PanelController {
var panelView = LeftPanelView()
...
}
在哪里
class LeftPanelView: PanelView {
...
}
和(最后一 block ......)
class PanelView: UIView {
...
}
我收到一条错误消息:LeftPanelController 不符合 PanelController 协议(protocol)
,原因很明显:panelView
的类型是 LeftPanelView
而不是 面板 View
。不过,这似乎对我来说真的很有限,因为 LeftPanelView
是 PanelView
的子类,所以它应该可以正常工作!但事实并非如此!
有人可以向我解释为什么会这样吗?如果有人能想出一个可能的解决方法?谢谢!
最佳答案
问题出在协议(protocol)中的 setter 上。
假设您想从 LeftPanelController
获取 panelView
。这很好,因为 LeftPanelView
可以做 PanelView
可以做的一切(甚至更多)。
如果你想设置 LeftPanelController
的 panelView
,你可以给它任何 PanelView
。因为您将 panelView
变量定义为 LeftPanelView
,所以 setter 有时会失败。
要解决此问题,您可以在 LeftPanelController
中执行以下操作:
var panelView: PanelView = LeftPanelView()
这意味着您将无法访问特定于 LeftPanelView
的任何方法或属性,除非先强制转换它。如果这不是问题,那么这应该可以解决您的问题!
关于ios - Swift 协议(protocol) - 属性类型子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32231420/