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 要求