如何在 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任何内容,则需要返回类型。由于您似乎想使用该函数来创建指定枚举类型的值,因此该返回类型可能应该是 EE? 。(您正在包装init?(rawValue:) ,这将返回一个可选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))

相关内容

  • 没有找到相关文章

最新更新