Как я могу использовать переменную, которая была инициализирована в выражении when? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно инициализировать copyToDay в выражении when, чтобы получить определенную строку дня, но как я могу использовать ее дальше? Мне нужна правильная строка в следующей функции, но 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)

Есть ли какой-нибудь способ получить copyToDay из выражения when? Спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018

Используйте when как выражение:

val copyToDay = when(it){
    copyHoursMonday -> R.string.MONDAY
    copyHoursTuesday -> R.string.TUESDAY
    //...
}
0 голосов
/ 08 ноября 2018

Причина, по которой он говорит, что он не инициализирован, заключается в том, что когда ваш код запускается, если переменная равна true переменная copyToDay будет инициализирована..но если it ложно copyToDay не будет инициализирован. Следовательно, вам необходимо учитывать ложный сценарий. Лучше всего установить для него значение по умолчанию чуть выше когда (это) {}

0 голосов
/ 08 ноября 2018

Это проблема масштаба. Возможно, переменная не была инициализирована. it - это, в данном случае, используемый вами вид. Теперь, прежде чем я продолжу, я хочу упомянуть одну вещь: компилятор не знает, установлен ли или нет этот прослушиватель click для нескольких представлений или нет. В результате компилятор думает: «Если это какой-либо другой вид, он не будет инициализирован».

Что вы можете сделать, это добавить else к when:

else -> return@OnClickListener;

Это означает, что в любом другом случае возвращается. Он не выполняет код, который зависит от значения, и также не будет инициализирован.

В качестве альтернативы, вы можете назначить другое значение в else brach. Либо в порядке.

Кроме того, вы можете оптимизировать свой оператор 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
}
0 голосов
/ 08 ноября 2018

Вам нужна ветка 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
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...