выражение 'when' должно быть исчерпывающей ошибкой при использовании адаптеров - PullRequest
0 голосов
/ 15 октября 2018

Я хотел бы сделать что-то вроде этого:

class MyPagerAdapter : PagerAdapter() {
    override fun getItem(position: Int) = when(position) {
        0 -> Fragment0()
        1 -> Fragment1()
    }

    override fun getCount() = 2
}

Я уверен, что адаптер содержит только 2 элемента, поэтому getCount() просто возвращает 2. Но он показывает сообщение об ошибке, в котором говорится, что 'when' expression must be exhaustive, add necessary 'else' branch.Я понимаю, что могу добавить else, чтобы решить ее, но действительно ужасно писать код вроде:

    when(position) {
        0 -> Fragment0()
        1 -> Fragment1()
        else -> Fragment()    // Impossible to get here
    }

Есть ли лучший способ решить эту проблему?Благодаря.

Ответы [ 4 ]

0 голосов
/ 15 октября 2018

Как уже говорили другие, если вы уверены, что не будет больше элементов, вы можете изменить ветку else на throw IllegalStateException("Fragment $position is not correct").Попытка использовать и enum или запечатанный класс, чтобы сделать случай исчерпывающим, просто переместит эту проблему в функцию, которую вы используете для преобразования Int в новый ограниченный тип.

Другой вариант, если вы полностью уверены, что выиграли 'Больше никаких вариантов, и вы хотите сохранить краткое объявление - использовать выражение if:

fun getItem(position: Int) = if(position == 0) Fragment0() else Fragment1()

Проблема с этим подходом заключается в том, что он не расширяемый, если у вас появляются новые элементы на адаптере.Также, если передана неверная позиция, вместо сбоя она вернет экземпляр Fragment1 ().В зависимости от ваших потребностей может быть хорошим вариантом или нет.

0 голосов
/ 15 октября 2018

1) Если невозможно попасть в другую ветку, чем вы можете

throw IllegalStateException («позиция $ Fragment неверна»)

Ваш код может бытьизменилось в любое время.И это поможет вам лучше понять, что вы отправляете неверные значения.

2) Также, если у вас есть только два случая, которые вы можете использовать, если (..) {} else {} оператор

3) Вы можете использовать значения Enum, чтобы не иметь другой ветви (вместо позиции).

0 голосов
/ 15 октября 2018

Если вы хотите сделать это правильно, бросьте исключение в ветку else.Имейте в виду, что в будущем, возможно, кто-то другой будет поддерживать вашу кодовую базу и попытается использовать этот адаптер в другой ситуации.

Я знаю, что это кажется маловероятным прямо сейчас и требует лишних дополнительных усилий, но привыкнуть кэти мелочи важны ИМХО.

0 голосов
/ 15 октября 2018

Компилятор не может понять, что position равно in 0 until 1.Вы должны добавить ветку else и надеяться, что она никогда не будет вызвана:

else -> throw AssertionError()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...