bjn*_*ner 2 generics enums swift rawrepresentable
我正在尝试在swift中编写一个函数,在这样的泛型函数中创建一个rawValue枚举:
enum STATE: String {
case OK = "OK"
case ERROR = "ERROR"
}
func createEnum<E: RawRepresentable>(rawValue: T.Type) {
return E(rawValue: rawValue) // compiler error
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
如上所述,如果你想要return任何东西,你的函数需要一个返回类型.由于您似乎想要使用该函数来创建指定枚举类型的值,因此该返回类型应该是E或者E?.(你正在换行init?(rawValue:),它会返回一个可选项,因为它rawValue可能不会映射到其中一个枚举的情况.所以你要么将可选的传递给你的调用者,要么在你的函数中有一些逻辑来解包它并处理nil的情况.)
您的参数rawValue还需要一个实际类型 - T.Type在声明中不是完全限定类型.你可以在使用枚举的原始值类型RawValuetypealias了RawRepresentable(你已经给出通用约束)协议定义.
那么,这是你的功能:
func createEnum<E: RawRepresentable>(rawValue: E.RawValue) -> E? {
return E(rawValue: rawValue)
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您尝试这样的事情:
enum Foo: Int {
case One = 1
case Two = 2
}
createEnum(1)
createEnum<Foo>(1)
Run Code Online (Sandbox Code Playgroud)
它不起作用 - 第一个没有指定要使用的泛型函数的哪个特化,而第二个不起作用,因为Swift不允许手动专门化泛型函数.相反,你必须设置它,以便类型推断做它的事情:
let f: Foo? = createEnum(1)
someFuncThatTakesAFoo(createEnum(1))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1644 次 |
| 最近记录: |