Перебор значения перечисления в Kotlin - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть код ниже

enum class State {
    EMPTY, LOADING, DATA, ERROR
}
private var currentState = State.EMPTY

private var timer: Timer? = null

fun startTimer() {
    if (timer == null) {
        timer = fixedRateTimer(period = 1000, action = {

            mainvView.showView(currentState)
            currentState = when (currentState) {
                State.EMPTY -> State.LOADING
                State.LOADING -> State.DATA
                State.DATA -> State.ERROR
                State.ERROR -> State.EMPTY
            }
        })
    }
}

Где он перебирает перечисление через фиксированный интервал 1 с.

Мне эта штука не особо нравится

            currentState = when (currentState) {
                State.EMPTY -> State.LOADING
                State.LOADING -> State.DATA
                State.DATA -> State.ERROR
                State.ERROR -> State.EMPTY
            }

Поскольку я надеялся больше на что-то ниже, так что мне не нужно явно записывать все переходы между состояниями

            if (currentState == State.ERROR) {
                currentState = State.EMPTY
            } else {
                currentState++
            }

Очевидно, currentState++ невозможно. Есть ли другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете использовать универсальную функцию

inline operator fun <reified E : Enum<E>> E.inc() =
    enumValues<E>()[(ordinal + 1) % enumValues<E>().size]
0 голосов
/ 27 апреля 2018

Вы можете сделать что-то вроде currentState++, если вы используете перегрузку операторов, например

operator fun State.inc(): State = when(this){
            State.EMPTY -> State.LOADING
            State.LOADING -> State.DATA
            State.DATA -> State.ERROR
            State.ERROR -> State.EMPTY
        }

Или, если хотите просто просмотреть список

operator fun State.inc(): State {
             val size = State.values().size
             return State.values()[(this.ordinal + 1) % size]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...