swift – 特定于枚举成员的通用约束

swift – 特定于枚举成员的通用约束,第1张

概述我有一个关联类型的协议: protocol MyProtocol { associatedtype Q} 现在我想要一个类似的枚举 enum MyEnum<Q> { case zero case one(MyProtocol) case two(MyProtocol, MyProtocol)} 其中每个关联值都有Q作为其关联类型.这不起作用: enum MyEn 我有一个关联类型的协议:

protocol MyProtocol {    associatedtype Q}

现在我想要一个类似的枚举

enum MyEnum<Q> {    case zero    case one(MyProtocol)    case two(MyProtocol,MyProtocol)}

其中每个关联值都有Q作为其关联类型.这不起作用:

enum MyEnum<Q> {    case zero    case one<P: MyProtocol where P.Q == Q>(P)    case two<P1: MyProtocol,P2: MyProtocol where P1.Q == Q,P2.Q == Q>(P1,P2)}

显然,单个枚举成员不能拥有自己的通用约束.

我唯一能想到的是将这些约束移动到枚举声明中,但这会固定相关的类型.为了证明为什么这不是我想要的,这是我希望能够做到的:

struct StructA: MyProtocol {    typealias Q = Int}struct StructB: MyProtocol {    typealias Q = Int}var enumValue = MyEnum.one(StructA())enumValue = .two(StructB(),StructA())enumValue = .two(StructA(),StructB())

有没有解决这个限制的方法?

解决方法 键入擦除.答案总是类型擦除.

你需要的是AnyProtocol类型:

struct AnyProtocol<Element>: MyProtocol {    typealias Q = Element    // and the rest of the type-erasure forwarding,based on actual protocol}

现在您可以创建一个使用它们的枚举

enum MyEnum<Q> {    case zero    case one(AnyProtocol<Q>)    case two(AnyProtocol<Q>,AnyProtocol<Q>)}

有关如何构建类型擦除器的更深入讨论,请参阅A Little Respect for AnySequence.

Swift不能将PAT(具有相关类型的协议)作为真实类型甚至抽象类型进行讨论.它们只能是约束.为了将其用作抽象类型,您必须将其提取为类型橡皮擦.幸运的是,这是非常机械的,在大多数情况下并不困难.它是如此机械,最终编译器将有希望为您完成工作.但有人必须建造这个盒子,今天就是你.

总结

以上是内存溢出为你收集整理的swift – 特定于枚举成员的通用约束全部内容,希望文章能够帮你解决swift – 特定于枚举成员的通用约束所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存