Kotlin:回归可以从"何时"解除

Seo*_*oon 30 kotlin

switch在Kotlin 的替代品是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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,上述声明发出了警告信息Return can be lifted out of 'when'.

有谁知道什么是正确的使用方式when?如何解决上述问题?

s1m*_*nw1 58

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

  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
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 函数体由单个语句组成,可以更改为表达式主体:

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

  • 作为 Kotlin 初学者,与 Java 相比,这让我觉得非常优雅 (3认同)

Sai*_*f C 7

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
    }
}
Run Code Online (Sandbox Code Playgroud)


msr*_*rd0 5

if在 Kotlin 中,包括、whenand在内的多个语句try可以返回值。因此,在您的情况下,您可以重构该语句,让该when语句返回实际值,然后您可以从函数返回该值。

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

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