Kotlin:当'退货时,可以退出。

时间:2017-12-29 05:56:11

标签: kotlin

Kotlin中switch的替代方案是when。因此,在回收器视图适配器中,当我返回视图类型时,我使用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的正确方法是什么?如何解决上述问题?

3 个答案:

答案 0 :(得分:43)

您使用when就像一个简单的Java switch语句,这完全没问题,但不是很惯用。您可以通过两个步骤重构代码:

  1. Kotlin when可用作表达式returns a value if you wish

    override fun getItemViewType(position: Int): Int {
        return when (position) {
            0 -> ItemViewType.TITLE.type
            1 -> ItemViewType.SUBTITLE.type
            2 -> ItemViewType.ITEM.type
            else -> -1
         }
    }
    
  2. 可以将由单个语句组成的函数体更改为expression body

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

答案 1 :(得分:4)

您的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
    }
}

答案 2 :(得分:2)

在Kotlin中,包括ifwhentry在内的多个语句都可以返回一个值。因此,在您的情况下,您可以重构语句以使when语句返回实际值,然后您可以从函数返回。

因此,您可以将方法简化为以下内容:

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