簡體   English   中英

Swift協議 - 屬性類型子類

[英]Swift Protocol - Property type subclass

我正在定義一個名為PanelController的協議,我想在其中存儲一個PanelView PanelView本身是UIView的子類,定義了面板的基本結構。 我有三個不同的視圖,它們是PanelView子類: LeftPanelMidPanelRightPanel 對於每個面板,我想定義一個符合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 這似乎真的限於我,因為LeftPanelViewPanelView的子類,所以它應該工作! 但事實並非如此!

有人可以向我解釋為什么會這樣,如果有人能想出一個,可能的解決方法? 謝謝!

問題在於協議中的setter。

比方說,你想要得到的panelViewLeftPanelController 這沒關系,因為LeftPanelView可以完成PanelView可以做的所有事情(以及更多)。

如果你想設置panelViewLeftPanelController ,你可以給它任何PanelView 因為您將panelView變量定義為LeftPanelView ,所以setter有時會失敗。

要解決此問題,您可以在LeftPanelController執行以下LeftPanelController

var panelView: PanelView = LeftPanelView()

這意味着您將無法訪問任何特定於LeftPanelView方法或屬性,而無需先將其LeftPanelView轉換。 如果這不是問題,那么這應該可以解決您的問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM