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