如何在 Swift 中创建通用枚举的实例
How can I create an instance of a generic enum in Swift
我正在尝试在 swift 中编写一个函数,它在像这样的通用函数中创建一个 rawValue 枚举:
enum STATE: String {
case OK = "OK"
case ERROR = "ERROR"
}
func createEnum<E: RawRepresentable>(rawValue: T.Type) {
return E(rawValue: rawValue) // compiler error
}
我错过了什么吗?
如前所述,您的函数需要 return 类型,如果您希望它成为 return
任何类型。由于您似乎想使用该函数创建指定枚举类型的值,因此 return 类型可能应该是 E
或 E?
。 (您正在包装 init?(rawValue:)
,其中 return 是可选的,因为 rawValue
可能不会映射到枚举案例之一。因此您要么想将可选的传递给调用者,要么让在你的函数中有一些逻辑来解包它并处理 nil 情况。)
您的参数 rawValue
也需要一个真实类型 — T.Type
在您的声明中不是完全限定类型。您可以使用 RawRepresentable
协议(您已经将其作为通用约束给出)定义的 RawValue
类型别名来获取枚举的原始值类型。
所以,这是你的函数:
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))
我正在尝试在 swift 中编写一个函数,它在像这样的通用函数中创建一个 rawValue 枚举:
enum STATE: String {
case OK = "OK"
case ERROR = "ERROR"
}
func createEnum<E: RawRepresentable>(rawValue: T.Type) {
return E(rawValue: rawValue) // compiler error
}
我错过了什么吗?
如前所述,您的函数需要 return 类型,如果您希望它成为 return
任何类型。由于您似乎想使用该函数创建指定枚举类型的值,因此 return 类型可能应该是 E
或 E?
。 (您正在包装 init?(rawValue:)
,其中 return 是可选的,因为 rawValue
可能不会映射到枚举案例之一。因此您要么想将可选的传递给调用者,要么让在你的函数中有一些逻辑来解包它并处理 nil 情况。)
您的参数 rawValue
也需要一个真实类型 — T.Type
在您的声明中不是完全限定类型。您可以使用 RawRepresentable
协议(您已经将其作为通用约束给出)定义的 RawValue
类型别名来获取枚举的原始值类型。
所以,这是你的函数:
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))