如何使用 CustomStringConvertible 和 RawRepresentable 组合类型指定函数参数的类型?

Posted

技术标签:

【中文标题】如何使用 CustomStringConvertible 和 RawRepresentable 组合类型指定函数参数的类型?【英文标题】:How to specify the type of a function parameter with combined type CustomStringConvertible and RawRepresentable? 【发布时间】:2020-03-27 10:22:41 【问题描述】:

我想要一个通用函数,它可以通过提供枚举类型和Int 原始值来实例化我拥有的几种不同enum 类型的对象。这些enums 也是CustomStringConvertible

我试过了:

func myFunc(type: CustomStringConvertible.Type & RawRepresentable.Type, rawValue: Int)

导致 3 个错误:

非协议、非类类型“CustomStringConvertible.Type”不能在协议约束类型中使用 非协议、非类类型“RawRepresentable.Type”不能在协议约束类型中使用 协议“RawRepresentable”只能用作通用约束,因为它具有 Self 或关联的类型要求

暂时忘记“CustomStringConvertible”,我也试过了:

private func myFunc<T: RawRepresentable>(rawValue: Int, skipList: [T]) 
    let thing = T.init(rawValue: rawValue)

但是,尽管代码完成提示了这一点,但会导致关于 T.init(rawValue:) 的错误:

无法使用“(rawValue: Int)”类型的参数列表调用“init”

我怎样才能形成这样的通用函数?

【问题讨论】:

【参考方案1】:

问题是 T.RawValue 在您当前的类型约束下可能不是 Int 。您需要指定 T.RawValue == Int 以便将您的 rawValue: Int 输入参数传递给 init(rawValue:)

func myFunc<T: RawRepresentable & CustomStringConvertible>(rawValue: Int, skipList: [T]) where T.RawValue == Int 
    let thing = T.init(rawValue: rawValue)

【讨论】:

是的,正是我要建议的。这是如何将自己与名称混淆的一个很好的例子;看起来原始可表示的原始值已解决,但不是,这是一个不同的原始值。 :) 谢谢,我现在如何将CustomStringConvertible 添加到组合中? @matt 我同意,这很令人困惑。在我的真实代码中不用担心它有一个适当的/特定于上下文的名称。 @meaning-matters 检查我更新的答案,您只需要使用 &amp; 运算符来要求泛型类型符合多个协议。 @meaning-matters 因为RawRepresentable.Type 是元类型。但是,您需要具体类型,因为您传递的是实例,而不是类型,所以您只需要 RawRepresentable

以上是关于如何使用 CustomStringConvertible 和 RawRepresentable 组合类型指定函数参数的类型?的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?