如何使用在when-expression中已初始化的变量?

时间:2018-11-08 10:08:03

标签: android kotlin

我必须在when-表达式中初始化copyToDay才能获取特定的日期字符串,但是如何进一步使用它呢?我需要在以下函数中使用正确的字符串,但是Android Studio说copyToDay尚未初始化。 这是我的代码:

    val onCheckListener = View.OnClickListener {
        it as CheckedTextView
        it.isChecked = !it.isChecked

        when(it){
            copyHoursMonday -> copyToDay = R.string.MONDAY
            copyHoursTuesday -> copyToDay = R.string.TUESDAY
            copyHoursWednesday -> copyToDay = R.string.WEDNESDAY
            copyHoursThursday -> copyToDay = R.string.THURSDAY
            copyHoursFriday -> copyToDay = R.string.FRIDAY
            copyHoursSaturday -> copyToDay = R.string.SATURDAY
            copyHoursSunday -> copyToDay = R.string.SUNDAY
            }
            //Here's the error with copyToDay
            saveCopy(initialStartInMinutes, initialEndInMinutes, isHappyHour, d, copyToDay)
        }

    d.copyHoursMonday.setOnClickListener(onCheckListener)
    d.copyHoursTuesday.setOnClickListener(onCheckListener)
    d.copyHoursWednesday.setOnClickListener(onCheckListener)
    d.copyHoursThursday.setOnClickListener(onCheckListener)
    d.copyHoursFriday.setOnClickListener(onCheckListener)
    d.copyHoursSaturday.setOnClickListener(onCheckListener)
    d.copyHoursSunday.setOnClickListener(onCheckListener)

是否有一些方法可以从when表达式中获取copyToDay? 感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

这是范围问题。该变量可能尚未初始化。在这种情况下,it是您正在使用的视图。现在,在继续之前,我想提一件事:编译器不知道您是否为多个视图设置了单击侦听器。结果,编译器认为“如果这是其他视图,将不会被初始化”。

您可以做的是在else上添加when

else -> return@OnClickListener;

这意味着,在任何其他情况下,它都会返回。它不会执行依赖于该值的代码,也不会被初始化。

或者,您可以在else分支中分配其他值。都可以。

此外,您可以优化when语句。由于您在每个分支上都分配了相同的值,因此您只需执行以下操作即可:

val copyToDay = when(it){
    copyHoursMonday -> R.string.MONDAY
    copyHoursTuesday -> R.string.TUESDAY
    copyHoursWednesday -> R.string.WEDNESDAY
    copyHoursThursday -> R.string.THURSDAY
    copyHoursFriday -> R.string.FRIDAY
    copyHoursSaturday -> R.string.SATURDAY
    copyHoursSunday -> R.string.SUNDAY
    else -> return@OnClickListener
}

答案 1 :(得分:3)

使用when作为表达式:

val copyToDay = when(it){
    copyHoursMonday -> R.string.MONDAY
    copyHoursTuesday -> R.string.TUESDAY
    //...
}

答案 2 :(得分:2)

您的else语句中需要一个when分支。这样,编译器就知道您的变量已在每个可能的分支中初始化。 例如:

      when(it){
        copyHoursMonday -> copyToDay = R.string.MONDAY
        copyHoursTuesday -> copyToDay = R.string.TUESDAY
        copyHoursWednesday -> copyToDay = R.string.WEDNESDAY
        copyHoursThursday -> copyToDay = R.string.THURSDAY
        copyHoursFriday -> copyToDay = R.string.FRIDAY
        copyHoursSaturday -> copyToDay = R.string.SATURDAY
        else -> copyToDay = R.string.SUNDAY
      }

答案 3 :(得分:0)

之所以说它未初始化,是因为如果您的代码在 it 变量为 true 的情况下运行,则将初始化copyToDay变量。但是,如果 it 是错误的copyToDay不会被初始化。 因此,您需要解决错误的情况。最好是在 when(it){}

上方为其设置默认值