【问题标题】:associatedtype protocol conformance issuesassociatedtype 协议一致性问题
【发布时间】:2021-02-10 07:55:15
【问题描述】:

我有 3 个协议来定义Mediator 使用Host 提取Client 的关系

  1. Host
  2. Client
  3. Mediator

我的目标是让Host 也充当Mediator。这些是我的类和协议定义:

class Host {}
class Client {}

protocol HostProtocol {}
protocol ClientProtocol {}

extension Host: HostProtocol {}
extension Client: ClientProtocol {}

protocol MediatorProtocol {
    associatedtype H = HostProtocol
    associatedtype C = ClientProtocol

    func getClientFrom(host: H) -> C?
}

然后我扩展我的MediatorProtocol 以添加一个实现

extension MediatorProtocol where H == Host, C == Client {
    func getClientFrom(host: H) -> C? {
        return Client()
    }
}

现在,当我尝试使我的主机符合 MediatorProtocol 时,我收到一条错误消息

Type 'Host' 不符合协议 MediatorProtocol

extension Host: MediatorProtocol {}

有什么想法吗?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    只需在此更改协议规范

    extension MediatorProtocol where H == Host, C == Client {
        func getClientFrom(host: Host) -> Client? {
            return Client()
        }
    }
    

    即使没有 where 规范,您也可以重写它。 Swift 可以从函数声明中推断出关联的类型(这就是为什么它不能在你的代码中这样做)。

    extension MediatorProtocol {
        func getClientFrom(host: Host) -> Client? {
            return Client()
        }
    }
    

    【讨论】:

    • 您能解释一下为什么将参数更改为协议扩展中的具体实现会消除错误吗?
    • 我不是编译器专家,但据我了解 H 和 C 是别名,这意味着它不包含任何类型信息。为了正确替换(推断类型)别名,您需要在实现中指定具体类型。但是您确实尝试使用别名而不是类型。 where 子句不会替换类型上的别名,它只是对专门声明施加约束。在这种情况下,它实际上并没有做任何事情,因为我们用具体类型来限制实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2018-05-20
    相关资源
    最近更新 更多