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
, не отбрасывая их в первую очередь. Если это не проблема, тогда это должно решить вашу проблему!