Котлин: Возвращение может быть отменено из "когда"

Альтернатива switch в Котлин - это when. Таким образом, внутри адаптера просмотра recycler, когда я возвращаю тип вида, я использую, when:

override fun getItemViewType(position: Int): Int {
    when (position) {
        0 -> return ItemViewType.TITLE.type
        1 -> return ItemViewType.SUBTITLE.type
        2 -> return ItemViewType.ITEM.type
        else -> return -1
    }
}

Но вышеприведенное выражение отправляет наше предупреждающее сообщение " Return can be lifted out of 'when'.

Кто-нибудь знает, какой может быть правильный способ использования, when? И что нужно сделать, чтобы исправить вышеупомянутый случай?

Ответ 1

Вы используете when как простой оператор switch Java, что хорошо, но не очень идиоматично и может быть улучшено. Вы можете изменить свой код в два этапа:

  1. Kotlin, when можно использовать в качестве выражения, он возвращает значение, если вы хотите:

    override fun getItemViewType(position: Int): Int {
        return when (position) {
            0 -> ItemViewType.TITLE.type
            1 -> ItemViewType.SUBTITLE.type
            2 -> ItemViewType.ITEM.type
            else -> -1
         }
    }
    
  2. Тело функции, теперь состоящее из одного оператора, можно изменить на тело выражения:

    override fun getItemViewType(position: Int) = when (position) {
         0 -> ItemViewType.TITLE.type
         1 -> ItemViewType.SUBTITLE.type
         2 -> ItemViewType.ITEM.type
         else -> -1
    }
    

Ответ 2

Твое, when правильно, однако у Котлина есть возможность снять возврат из "когда", если ты возвращаешься в каждом случае, таким образом, он становится:

override fun getItemViewType(position: Int): Int {
    return when (position) {
        0 -> ItemViewType.TITLE.type
        1 -> ItemViewType.SUBTITLE.type
        2 -> ItemViewType.ITEM.type
        else -> -1
    }
}

Ответ 3

В Kotlin несколько операторов, включая if, when и try, могут возвращать значение. Таким образом, в вашем случае вы можете реорганизовать оператор, чтобы оператор when возвращал фактическое значение, которое затем можно вернуть из функции.

Таким образом, вы можете упростить свой метод следующим образом:

override fun getItemViewType(position: Int): Int = when (position) {
    0 -> ItemViewType.TITLE.type
    1 -> ItemViewType.SUBTITLE.type
    2 -> ItemViewType.ITEM.type
    else -> -1
}