区分 Swift 协议中继承的 `associatedtype`
Distinguishing between inherited `associatedtype`s in Swift protocols
我正在使用一个定义两个协议的库,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
}
但这不是受支持的语法。
有办法解决这个问题吗?
这已在 Swift 论坛的 Multiple protocols associatedtype name collision 中讨论过。吴晓迪写道:
It is very much possible, but the identically named associated types must be, in the conforming type, fulfilled by the same type.
In the future, there may be syntax added to allow types to conform to two protocols with such clashing requirements, but it adds great complexity in terms of implementation and is not without its own pitfalls for users (for example, it can get very confusing for end users of your type).
所以一个类型可以同时符合 A
和 B
以及相同的关联类型 T
,例如
struct Foo: A, B {
typealias T = String
}
并且协议可以继承自 A
和 B
并将 T
限制为相同的类型:
protocol C: A, B where T == String {
}
目前不支持同时遵守具有不同关联类型的协议。
我正在使用一个定义两个协议的库,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
}
但这不是受支持的语法。 有办法解决这个问题吗?
这已在 Swift 论坛的 Multiple protocols associatedtype name collision 中讨论过。吴晓迪写道:
It is very much possible, but the identically named associated types must be, in the conforming type, fulfilled by the same type.
In the future, there may be syntax added to allow types to conform to two protocols with such clashing requirements, but it adds great complexity in terms of implementation and is not without its own pitfalls for users (for example, it can get very confusing for end users of your type).
所以一个类型可以同时符合 A
和 B
以及相同的关联类型 T
,例如
struct Foo: A, B {
typealias T = String
}
并且协议可以继承自 A
和 B
并将 T
限制为相同的类型:
protocol C: A, B where T == String {
}
目前不支持同时遵守具有不同关联类型的协议。