在Swift协议中区分继承的“ associatedtype”

时间:2019-04-08 16:45:01

标签: swift generics protocols associated-types

我正在使用一个库,该库定义了两个协议AB,每个协议都有其associatedtype T,如下所示:

protocol A {
    associatedtype T
}
protocol B {
    associatedtype T
}

这两个协议没有在T上耦合,因此理论上第三个协议可以从AB继承,typealias将每个T赋予不同的类型。不幸的是,我无法让Swift区分两个T。我尝试过类似的事情:

protocol C: A, B {
    typealias A.T = String
    typealias B.T = String
}

,但是不支持此语法。 有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

Multiple protocols associatedtype name collision的Swift论坛中对此进行了讨论。吴晓迪写道:

  

这是非常有可能的,但是名称相同的关联类型必须在一致类型中由相同类型实现。

     

将来,可能会添加语法以允许类型符合具有此类冲突要求的两个协议,但它在实现方面增加了极大的复杂性,并且对于用户而言并非没有缺陷(例如,它可以对于您这种类型的最终用户非常困惑。

因此,一个类型可以同时与AB都具有相同的关联类型T,例如

struct Foo: A, B {
    typealias T = String
}

并且协议可以同时继承AB并将T限制为相同的类型:

protocol C: A, B where T == String {

}

当前不支持两种具有不同关联类型的协议。