如何使用 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
类型的对象。这些enum
s 也是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:)
的错误:
我怎样才能形成这样的通用函数?
【问题讨论】:
【参考方案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 检查我更新的答案,您只需要使用 &
运算符来要求泛型类型符合多个协议。
@meaning-matters 因为RawRepresentable.Type
是元类型。但是,您需要具体类型,因为您传递的是实例,而不是类型,所以您只需要 RawRepresentable
。以上是关于如何使用 CustomStringConvertible 和 RawRepresentable 组合类型指定函数参数的类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]