Котлин: Возвращение может быть отменено из "когда"
Альтернатива 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, что хорошо, но не очень идиоматично и может быть улучшено. Вы можете изменить свой код в два этапа:
-
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
}
}
-
Тело функции, теперь состоящее из одного оператора, можно изменить на тело выражения:
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
}