【问题标题】:Swift Protocol - Property type subclassSwift 协议 - 属性类型子类
【发布时间】:2015-08-26 16:01:22
【问题描述】:

我正在定义一个名为PanelController 的协议,我想在其中存储一个PanelViewPanelView 本身是UIView 的子类,定义了面板的基本结构。我有三个不同的视图子类PanelViewLeftPanelMidPanelRightPanel。对于每个面板,我想定义一个符合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 的子类,所以它应该可以工作!但事实并非如此!

有人可以向我解释这是为什么,如果有人能想出一个可能的解决方法吗?谢谢!

【问题讨论】:

  • 它不符合,因为协议允许将 PanelView 的实例分配给 LeftPanelView 类型的属性。如果该属性在协议中声明为只读,则它应该编译。
  • 我假设这个问题之前已经回答过了,但是我在手机上很难搜索到:)

标签: ios swift syntax protocols


【解决方案1】:

问题出在协议中的设置器上。

假设您想从LeftPanelController 获取panelView。这很好,因为LeftPanelView 可以做所有PanelView 可以做的事情(以及更多)。

如果你想设置LeftPanelControllerpanelView,你可以给它任何PanelView。因为您将panelView 变量定义为LeftPanelView,所以setter 有时可能会失败。

要解决此问题,您可以在 LeftPanelController 中执行以下操作:

var panelView: PanelView = LeftPanelView()

这意味着您将无法访问特定于LeftPanelView 的任何方法或属性,除非先强制转换它。如果这不是问题,那么这应该可以解决您的问题!

【讨论】:

  • 您知道将类型(即LeftPanelView)存储在变量中以供以后转换的方法吗? (为了进一步将视图与PanelController 分离。)
  • 用例是什么?如果您需要LeftPanelView 对象,则应存储该类型的对象。如果您有一个正在使用的协议,我假设特定类型的对象无关紧要。如果是这样,协议可能不是合适的解决方案。
  • 如果PanelView 是他们都遵守的协议,同样的解释是否适用?我遇到了类似的问题,除了我的PanelView 是一个协议。您的解释在从基类继承的情况下是有道理的,但我很难理解为什么这不适用于协议,因为您关心的是它们实现了协议中定义的方法。
  • 是的,解释仍然适用。问题是控制器认为panelViewLeftPanelView 而不是PanelView。这就是显式声明解决问题的原因。这有帮助吗?
  • 即使使用 get-only 属性也存在问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多