Kotlin / Android: возвращение может быть отменено из «когда»

Альтернатива 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 ? И что нужно сделать, чтобы исправить вышеупомянутый случай?

Вы используете, when похожий switch как простой оператор, который полностью прекрасен, но не очень идиоматичен. Я бы рекомендовал реорганизовать этот код в два этапа: во-первых, when в Kotlin можно использовать выражение, оно возвращает значение, если вы хотите :

 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 } 

В 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 } 

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

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

попробуйте этот код для использования, when в kotlin:

 fun transform(color: String): Int { return when (color) { "Red" -> 0 "Green" -> 1 "Blue" -> 2 else -> throw IllegalArgumentException("Invalid color param value") } }