Swift Protocol - подтип типа свойства

Я определяю протокол под названием PanelController, в котором я хотел бы сохранить PanelView. PanelView сам является подклассом UIView и определяет основную структуру панели. У меня есть три разных представления, что подкласс PanelView: LeftPanel, MidPanel и RightPanel. Для каждой из этих панелей я хотел бы определить xxxPanelController (левый, средний, правый), который соответствует протоколу PanelController.

Проблема, с которой я столкнулся, находится в протоколе и 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 not PanelView. Это кажется мне действительно ограниченным, потому что LeftPanelView является подклассом PanelView, поэтому он должен просто работать! Но это не так!

Может кто-нибудь объяснить мне, почему это так, и если кто-нибудь может придумать один из возможных способов обхода? Спасибо!

Ответ 1

Проблема заключается в настройщике протокола.

Скажем, вы хотите ПОЛУЧИТЬ panelView от LeftPanelController. Это прекрасно, потому что LeftPanelView может делать все panelView может (и многое другое).

Если вы хотите установить panelView из LeftPanelController, хотя вы можете указать ему panelView. Поскольку вы определяете переменную panelView как LeftPanelView, средство настройки может иногда терпеть неудачу.

Чтобы исправить это, вы можете сделать следующее в LeftPanelController:

var panelView: PanelView = LeftPanelView()

Следствием этого является то, что вы не сможете получить доступ к каким-либо методам или свойствам, специфичным для LeftPanelView, не отбрасывая их в первую очередь. Если это не проблема, тогда это должно решить вашу проблему!