2015-10-16 3 views
0

Я ищу способ получить значение перечисления из целого числа, используя его тип.Создание экземпляра перечисления из его типа

Вот пример того, что я хочу сделать;

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?

ответ

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) 
} 
+0

Есть ли способ, чтобы ограничить RawRepresentable к одному, где RawValue является Int? –

+0

@jackwilsdon: Да :) –

+1

Большое вам спасибо! –

Смежные вопросы