【问题标题】:How can I create an instance of a generic enum in Swift如何在 Swift 中创建通用枚举的实例
【发布时间】:2015-01-27 17:36:31
【问题描述】:

我正在尝试在 swift 中编写一个函数,在这样的通用函数中创建一个 rawValue 枚举:

enum STATE: String {
    case OK = "OK"
    case ERROR = "ERROR"
}

func createEnum<E: RawRepresentable>(rawValue: T.Type) {
    return E(rawValue: rawValue) // compiler error 
}

我错过了什么吗?

【问题讨论】:

  • 你的函数的返回类型是Void,一方面。
  • 对不起,这只是一个错字

标签: swift generics enums rawrepresentable


【解决方案1】:

如前所述,如果您希望它为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))

【讨论】:

  • 脚注:大概你对这个函数的“真实”预期使用在其中包含了一些有用的逻辑——否则仅仅在init(rawValue:) 周围放置一个通用包装器没有多大意义,因为你仍然需要知道(或能够推断)调用站点的枚举类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多