Swift 协议 - 属性 类型子类
Swift Protocol - Property type subclass
我正在定义一个名为 PanelController
的协议,我想在其中存储一个 PanelView
。 PanelView
本身是UIView
的子类,定义了panel的基本结构。我有三个不同的视图子类 PanelView
:LeftPanel
、MidPanel
和 RightPanel
。对于这些面板中的每一个,我想定义一个符合 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
。不过,这似乎对我来说真的很有限,因为 LeftPanelView
是 PanelView
的子类,所以它应该可以正常工作!但事实并非如此!
有人可以向我解释这是为什么吗?如果有人能想出一个可能的解决方法?谢谢!
问题出在协议中的 setter。
假设您想从 LeftPanelController
获取 panelView
。没关系,因为 LeftPanelView
可以做 PanelView
可以做的一切(甚至更多)。
如果你想设置 LeftPanelController
的 panelView
,你可以给它任何 PanelView
。因为您将 panelView
变量定义为 LeftPanelView
,所以 setter 有时会失败。
要解决此问题,您可以在 LeftPanelController
中执行以下操作:
var panelView: PanelView = LeftPanelView()
这意味着您将无法访问特定于 LeftPanelView
的任何方法或属性,除非先对其进行转换。如果这不是问题,那么这应该可以解决您的问题!
我正在定义一个名为 PanelController
的协议,我想在其中存储一个 PanelView
。 PanelView
本身是UIView
的子类,定义了panel的基本结构。我有三个不同的视图子类 PanelView
:LeftPanel
、MidPanel
和 RightPanel
。对于这些面板中的每一个,我想定义一个符合 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
。不过,这似乎对我来说真的很有限,因为 LeftPanelView
是 PanelView
的子类,所以它应该可以正常工作!但事实并非如此!
有人可以向我解释这是为什么吗?如果有人能想出一个可能的解决方法?谢谢!
问题出在协议中的 setter。
假设您想从 LeftPanelController
获取 panelView
。没关系,因为 LeftPanelView
可以做 PanelView
可以做的一切(甚至更多)。
如果你想设置 LeftPanelController
的 panelView
,你可以给它任何 PanelView
。因为您将 panelView
变量定义为 LeftPanelView
,所以 setter 有时会失败。
要解决此问题,您可以在 LeftPanelController
中执行以下操作:
var panelView: PanelView = LeftPanelView()
这意味着您将无法访问特定于 LeftPanelView
的任何方法或属性,除非先对其进行转换。如果这不是问题,那么这应该可以解决您的问题!