【问题标题】:Define a protocol type variable in another protocol在另一个协议中定义一个协议类型变量
【发布时间】:2022-01-22 21:01:53
【问题描述】:

我想在其他协议 p3 和类 c1 中定义协议 p1 类型的变量 v1 strong> 符合协议 p3 我想从另一个协议 p2 定义 v1,它是 p1 的子协议>.

在正常情况下我得到了这个错误

类型'c1'不符合协议'p3'

你有什么解决办法吗?

protocol p1 {}

protocol p2: p1 {}

protocol p3 {
    var del: p1! { get set }
}

class c1: p3 {
    var del: p2!
}

【问题讨论】:

  • 首先,这违反了LSP
  • 我使用 VIP 架构,并且我有一个 vipViewController 协议,该协议具有交互变量,这是一种业务逻辑协议。我想在特定业务逻辑协议的每个 viewController 中定义交互器。 @Sweeper

标签: swift protocols associated-types


【解决方案1】:

你不能这样做。

您定义协议p2 以符合协议p1

你定义协议p3的成员del来确认协议p1

您定义类c1 以符合协议p3,并定义其成员del 以符合p2

问题是:如果类 c1 符合协议 p3,那么您应该能够将任何符合协议 p1 的内容分配给它的 del 成员。这就是符合p1 协议的意思,正如您自己定义的那样。

但是您已经定义了类c1del 成员以符合协议p2。这就是问题所在。

这确实以一种方式起作用 - 任何符合协议 p2 的内容都已知也符合协议 p1,因此您可以将任何符合协议 p2 的内容分配给类 c1 的成员 @ 的实例987654342@就可以了。

但是,它不能以另一种方式工作。符合协议p1 的事物未定义为符合协议p2。所以我们有差距。因为c1 类符合p3 协议,您应该能够将不符合p2 协议但符合p1 协议的东西分配给它的成员@ 987654349@。这就是您定义协议的方式。但是您定义了c1del 以符合协议p2

你在告诉类型系统两件不同的事情。你是说del 通过协议间接需要p1,你是说del 通过类定义直接需要p2。两者都不为真,所以编译器无法继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多