我正在尝试在swift中编写一个函数,在这样的泛型函数中创建一个rawValue枚举:
enum STATE: String {
case OK = "OK"
case ERROR = "ERROR"
}
func createEnum<E: RawRepresentable>(rawValue: T.Type) {
return E(rawValue: rawValue) // compiler error
}
我错过了什么吗?
答案 0 :(得分:6)
如上所述,如果你想要return
任何东西,你的函数需要一个返回类型。由于您似乎希望使用该函数来创建指定枚举类型的值,因此该返回类型应该是E
或E?
。 (你正在包装init?(rawValue:)
,它返回一个可选项,因为rawValue
可能无法映射到其中一个枚举案例。所以你要么想把可选的传递给你的调用者,要么有一些逻辑你打开它并处理零案件的功能。)
您的参数rawValue
也需要一个真实的类型 - T.Type
不是您声明中的完全限定类型。您可以使用RawValue
协议(您已经作为通用约束提供)定义的RawRepresentable
类型来获取枚举的原始值类型。
所以,这是你的功能:
func createEnum<E: RawRepresentable>(rawValue: E.RawValue) -> E? {
return E(rawValue: rawValue)
}
请注意,如果你尝试这样的话:
enum Foo: Int {
case One = 1
case Two = 2
}
createEnum(1)
createEnum<Foo>(1)
它不会起作用 - 第一个没有指定要使用的泛型函数的哪个特化,而第二个没有工作,因为Swift不允许手动专门化泛型功能。相反,你必须设置它,以便类型推断做它的事情:
let f: Foo? = createEnum(1)
someFuncThatTakesAFoo(createEnum(1))