我正在寻找一种使用它的类型从整数中获取枚举值的方法。
以下是我想要做的一个例子;
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中执行此操作?
答案 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)
}