ios - Swift 协议(protocol) - 属性类型子类

标签 ios swift syntax protocols

我正在定义一个名为 PanelController 的协议(protocol),我想在其中存储一个 PanelViewPanelView本身是UIView的子类,定义了面板的基本结构。我有三个不同的 View ,它们是 PanelView 的子类:LeftPanelMidPanelRightPanel。对于这些面板中的每一个,我想定义一个符合 PanelController 协议(protocol)的 xxxPanelController(左、中、右)。

我遇到的问题是协议(protocol)和 xxxPanelController

protocol PanelController {
    var panelView: PanelView { get set }
    ...
}

class LeftPanelController: UIViewController, PanelController {
    var panelView = LeftPanelView()
    ...
}

在哪里

class LeftPanelView: PanelView {
     ...
}

和(最后一 block ......)

class PanelView: UIView {
    ...
}

我收到一条错误消息:LeftPanelController 不符合 PanelController 协议(protocol),原因很明显:panelView 的类型是 LeftPanelView 而不是 面板 View 。不过,这似乎对我来说真的很有限,因为 LeftPanelViewPanelView 的子类,所以它应该可以正常工作!但事实并非如此!

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

最佳答案

问题出在协议(protocol)中的 setter 上。

假设您想从 LeftPanelController 获取 panelView。这很好,因为 LeftPanelView 可以做 PanelView 可以做的一切(甚至更多)。

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

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

var panelView: PanelView = LeftPanelView()

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

关于ios - Swift 协议(protocol) - 属性类型子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32231420/

相关文章:

ios - 点击/向后滑动时图像与之前的 View 重叠

types - 在 swift 中检测对象是否恰好是特定类型而不是该类型的子类

swift - 您如何知道登录问题是模拟器造成的还是您的代码造成的?

bash - 在 Bash 中,为什么条件结构中需要 `then`?

ios - 检测 View Controller 何时从弹出窗口出现

ios - 当前时间是否匹配某个时间范围?

ios - React native Pod 安装得到权限被拒绝

ios - 从工具栏 IOS 确定文本字段

c# - SQL 查询 : Incorrect Syntax error

python - 如何从生成器中获取元组?最佳实践