[英]Swift Protocol - Property type subclass
我正在定義一個名為PanelController
的協議,我想在其中存儲一個PanelView
。 PanelView
本身是UIView
的子類,定義了面板的基本結構。 我有三個不同的視圖,它們是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。
比方說,你想要得到的panelView
從LeftPanelController
。 這沒關系,因為LeftPanelView
可以完成PanelView
可以做的所有事情(以及更多)。
如果你想設置panelView
的LeftPanelController
,你可以給它任何PanelView
。 因為您將panelView
變量定義為LeftPanelView
,所以setter有時會失敗。
要解決此問題,您可以在LeftPanelController
執行以下LeftPanelController
:
var panelView: PanelView = LeftPanelView()
這意味着您將無法訪問任何特定於LeftPanelView
方法或屬性,而無需先將其LeftPanelView
轉換。 如果這不是問題,那么這應該可以解決您的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.