Как создать перечисление из строки в Котлин?
У меня есть перечисление с некоторыми экземплярами Foo
и Bar
. Если у меня есть строка "Foo"
, как я могу создать экземпляр Foo
из этого? В С# это будет Enum.Parse(...)
, есть ли эквивалент в Kotlin?
В настоящее время я нашел лучший способ создать factory, который включает все возможные строки, но подвержен ошибкам и плохо работает для больших перечислений.
Ответы
Ответ 1
Классы перечисления Kotlin имеют "статическую" функцию valueOf
для получения записи перечисления по строке (как перечисления Java). Кроме того, они имеют "статическую" функцию values
для получения всех записей enum. Пример:
enum class MyEnum {
Foo, Bar, Baz
}
fun main(args : Array<String>) {
println(MyEnum.valueOf("Foo") == MyEnum.Foo)
println(MyEnum.valueOf("Bar") == MyEnum.Bar)
println(MyEnum.values().toList())
}
Ответ 2
Как предложено bashor
, используйте MyEnum.valueOf()
, но имейте в виду, что оно выдает исключение, если значение не может быть найдено. Я рекомендую использовать:
enum class MyEnum {
Foo Bar Baz
}
try {
myVar = MyEnum.valueOf("Qux")
} catch(e: IllegalArgumentException) {
Log.d(TAG, "INVALID MyEnum value: 'Qux' | $e")
}
Ответ 3
Сделал бы это как
enum class MyEnum {
Foo, Bar, Baz
}
val value = MyEnum.values().firstOrNull {it.name == "Foo"} // results to MyEnum.Foo