我正在使用一个定义两个协议的库,A
和B
,每个协议都有associatedtype
T
,如下所示:
protocol A {
associatedtype T
}
protocol B {
associatedtype T
}
这两个协议没有在T上耦合,因此理论上第三个协议可以继承A
和B
,typealias
ing每个T
到不同的类型。不幸的是,我无法让Swift区分这两个T
s。我尝试过类似的东西:
protocol C: A, B {
typealias A.T = String
typealias B.T = String
}
但这不支持语法。有办法解决这个问题吗?
这已在Swift论坛的Multiple protocols associatedtype name collision中讨论过。吴小迪写道:
这是非常可能的,但是在相符类型中,相同名称的关联类型必须由相同类型实现。
在将来,可能会添加语法以允许类型符合具有此类冲突要求的两个协议,但它在实现方面增加了极大的复杂性并且对用户而言并非没有它自己的陷阱(例如,它可能会变得非常混乱您的类型的最终用户)。
因此,类型可以符合A
和B
,具有相同的相关类型T
,例如
struct Foo: A, B {
typealias T = String
}
并且协议可以继承A
和B
并将T
限制为相同类型:
protocol C: A, B where T == String {
}
目前不支持符合具有不同关联类型的两种协议。