我必须在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? 感谢您的帮助!
答案 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){}
上方为其设置默认值