Как я могу создать экземпляр общего перечисления в 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 
}

Я что-то пропустил?

1 ответ

Решение

Как уже отмечалось, вашей функции нужен тип возврата, если вы хотите return что-нибудь. Поскольку вы, похоже, хотите использовать функцию для создания значения указанного типа перечисления, этот тип возвращаемого значения, вероятно, должен быть E или же E?, (Вы оборачиваете init?(rawValue:), который возвращает необязательный, потому что rawValue может не отображаться в один из перечисленных случаев. Таким образом, вы либо хотите передать необязательное сообщение вызывающей стороне, либо использовать в своей функции некоторую логику, чтобы развернуть ее и обработать нулевой регистр.)

Ваш параметр rawValue также нужен реальный тип - T.Type не является полностью определенным типом в вашей декларации. Вы можете получить необработанный тип значения перечисления, используя RawValue Typealias, что RawRepresentable протокол (который вы уже дали в качестве общего ограничения) определяет.

Итак, вот ваша функция:

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))
Другие вопросы по тегам