使用适配器时,“ when”表达式必须是详尽的错误

时间:2018-10-15 08:55:09

标签: android kotlin

我想做这样的事情:

class MyPagerAdapter : PagerAdapter() {
    override fun getItem(position: Int) = when(position) {
        0 -> Fragment0()
        1 -> Fragment1()
    }

    override fun getCount() = 2
}

我确定适配器仅包含2个项目,因此getCount()仅返回2。但是它显示一条错误消息,说'when' expression must be exhaustive, add necessary 'else' branch。我知道我可以添加一个else来解决它,但是编写类似以下代码的代码确实很丑陋:

    when(position) {
        0 -> Fragment0()
        1 -> Fragment1()
        else -> Fragment()    // Impossible to get here
    }

有没有更好的解决方法?谢谢。

5 个答案:

答案 0 :(得分:4)

1)如果无法到达其他分支

  

引发IllegalStateException(“片段$位置不正确”)

您的代码可以随时更改。它将帮助您更好地了解您发送的值不正确。

2)同样,如果您只有两种情况,则可以使用if(..){} else {}语句

3)您可以使用Enum值不具有else分支(而不是位置)。

答案 1 :(得分:2)

编译器无法确定ObjectOnAction。 您必须添加Public Sub CheckboxHandle(obj As CheckBox) Dim rng As Range 'Sneaky sneaky changes Application.ScreenUpdating = False 'For Loop to go through each of the cells to the left of the check box For Each rng In Range(obj.TopLeftCell, obj.TopLeftCell.Offset(0, -7)) With rng 'if the checkbox is checked If obj.Value = -1 Then .Interior.Color = RGB(202, 226, 188) 'Adds the date and the person so you know who did the edit obj.TopLeftCell.Offset(0, 1).Value = Now & " by " & Application.username Else 'if it isn't checked .Interior.Pattern = xlNone 'removes the edit name and date obj.TopLeftCell.Offset(0, 1).Value = "" End If End With Next rng 'Shows all the changes at the same time Application.ScreenUpdating = True 'Changes the value of the progress bar to represent the project completion If obj.Value = -1 Then ActiveSheet.Range("E1").Value = ActiveSheet.Range("E1").Value + 1 / 207 Else ActiveSheet.Range("E1").Value = ActiveSheet.Range("E1").Value - 1 / 207 End If End Sub 分支,并希望它永远不会被调用:

position

答案 2 :(得分:2)

如果要正确执行操作,请在else分支中引发异常。请记住,将来可能会有其他人维护您的代码库,并在其他情况下尝试使用此适配器。

我知道现在看来这不太可能,并且不需要额外的努力,但是适应这些小事情对恕我直言很重要。

答案 3 :(得分:1)

正如其他人所说,如果您确定不会有更多元素,可以将else分支更改为throw IllegalStateException("Fragment $position is not correct")。尝试使用枚举或密封类使案例在出现问题时仅会将此问题移至您用于将Int转换为新的受限类型的函数。

如果您完全确定将不再有其他选项并且想要保持简洁的声明,那么另一个选择是使用if表达式:

fun getItem(position: Int) = if(position == 0) Fragment0() else Fragment1()

此方法的问题是,如果最终在适配器上有新元素,则该问题无法扩展。同样,如果传递了无效的位置,则不会崩溃,它将返回Fragment1()实例。 取决于您的需求可能是个不错的选择。

答案 4 :(得分:1)

这可能是或不是适当的选择,但可以让position接受任何值,并以模数调整值。在这种情况下,您只需要else来捕获实际丢失的条目:

class MyPagerAdapter : PagerAdapter() {
    override fun getItem(position: Int) = when(position % getCount()) {
        0 -> Fragment0()
        1 -> Fragment1()
        else -> throw IllegalStateException("Someone forgot to add enough fragment cases to 'when' clause!")
    }

    override fun getCount() = 2
}