3

我正在使用一个定义两个协议的库A, 和B,每个协议都有它的associatedtype T,如下所示:

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

这两个协议在 T 上不耦合,因此理论上第三个协议可以从两者继承Aand B,将typealias每个协议都继承T为不同的类型。不幸的是,我无法让 Swift 区分这两个Ts。我试过类似的东西:

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

但这不是支持的语法。有没有办法解决这个问题?

4

1 回答 1

3

这已在 Swift 论坛的多个协议关联类型名称冲突中进行了讨论。吴小迪写道:

这是很有可能的,但是同名的关联类型必须在符合类型中由相同的类型实现。

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

所以一个类型可以同时符合AB具有相同的关联类型T,例如

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

并且协议可以从两者继承AB限制T为相同的类型:

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

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

于 2019-04-08T17:04:16.937 回答