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