Kotlin: Instanciate перечисление от значения как Swift - PullRequest
0 голосов
/ 17 декабря 2018

Эй, я хочу создать новое перечисление по значению:

Мое перечисление:

enum class DirectionSwiped(raw: Int){
    LEFT(4),
    RIGHT(8);
}

Я хочу создать новое перечисление следующим образом:

val direction = DirectionSwiped(raw: 4)

Но я получаю эту ошибку:

Тип перечисления не может быть создан

Почему?это базовая функция ..

В быстром:

enum Direction: Int{
    case right = 2
}

И создать такой экземпляр:

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Да, вы можете

enum class DirectionSwiped(val raw: Int){
    LEFT(4),
    RIGHT(8);
}

val left = DirectionSwiped.LEFT
val right = DirectionSwiped.RIGHT

val leftRaw = DirectionSwiped.LEFT.raw
val rightRaw = DirectionSwiped.LEFT.raw

val fromRaw = DirectionSwiped.values().firstOrNull { it.raw == 5 }

Это был бы правильный способ доступа к экземплярам enum class

. То, что вы пытаетесь сделать, - это создать новый экземпляр вне определенияsite, который невозможен для enum или sealed классов, поэтому ошибка говорит, что конструктор private

0 голосов
/ 17 декабря 2018

Как говорит ошибка, вы не можете создавать экземпляры перечислений в Kotlin.Возможный обходной путь - использовать карту и 2 вспомогательных метода для получения значений перечисления из необработанных значений и наоборот:

enum class DirectionSwiped {
    LEFT,
    RIGHT;

    fun toRaw() = enumToRaw[this]
    companion object {
        val rawToEnum = mapOf(
                4 to LEFT,
                8 to RIGHT
        )
        val enumToRaw = rawToEnum.entries.associate{(k,v)-> v to k}
        fun ofRaw(raw: Int): DirectionSwiped? = rawToEnum[raw]
    }
}

Использование:

val direction = DirectionSwiped.ofRaw(4) // LEFT
val raw = DirectionSwiped.LEFT.toRaw() // 4
...