associatedtype 协议一致性问题

Posted

技术标签:

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

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

    Host Client 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 

有什么想法吗?

【问题讨论】:

【参考方案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 子句不会替换类型上的别名,它只是对专门声明施加约束。在这种情况下,它实际上并没有做任何事情,因为我们用具体类型来限制实现。

以上是关于associatedtype 协议一致性问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift 协议扩展,AssociatedType 被限制为集合,不能使用下标

协议只能用作通用约束,因为它具有 Self 或 associatedType 要求

associatedtype关联类型

swift protocol(协议) associatedtype关联类型

swift-associatedtype关键字

iOS-Swift协议中关联类型的使用