从类型

时间:2015-10-16 20:39:33

标签: swift enums

我正在寻找一种使用它的类型从整数中获取枚举值的方法。

以下是我想要做的一个例子;

enum TestEnum: Int {
    case A = 0
    case B = 1
    case C = 2
}

func createEnum<T>(value: Int, type: T.Type) -> T? {
    // Some magic here
}

let a = createEnum(0, type: TestEnum.self) // Optional(TestEnum.A)
let b = createEnum(1, type: TestEnum.self) // Optional(TestEnum.B)
let c = createEnum(2, type: TestEnum.self) // Optional(TestEnum.C)
let invalid = createEnum(3, type: TestEnum.self) // nil

我知道你可以得到这样的价值:

let a = TestEnum(rawValue: 0) // Optional(TestEnum.A)
let b = TestEnum(rawValue: 1) // Optional(TestEnum.B)
let c = TestEnum(rawValue: 2) // Optional(TestEnum.C)
let invalid = TestEnum(rawValue: 4) // nil

但是我希望能够“存储”要创建的枚举类型(在本例中为TestEnum),然后从值创建它,如我的示例所示。

有没有办法在Swift中执行此操作?

1 个答案:

答案 0 :(得分:2)

基础类型的枚举符合RawRepresentable 具有RawValue作为关联类型的协议:

func createEnum<T : RawRepresentable >(value: T.RawValue, type: T.Type) -> T? {
    return T(rawValue: value)
}

这适用于您的enum TestEnum: Int { ... }示例,但事实并非如此 限制为Int作为基础类型。

enum StrEnum : String {
    case X = "x"
    case Y = "y"
}

let x = createEnum("x", type: StrEnum.self) // Optional(StrEnum.X)

如果您希望将函数限制为具有基础类型Int的枚举,则在通用占位符上添加另一个约束:

func createEnum<T : RawRepresentable where T.RawValue == Int>(value: Int, type: T.Type) -> T? {
    return T(rawValue: value)
}