【问题标题】:Kotlin: "When statement" skips conditionKotlin:“当语句”跳过条件
【发布时间】:2020-09-05 14:46:33
【问题描述】:

我正在尝试使用 Kotlin 在 android 中验证表单。我的问题是,我的when statement 无法正常工作。当一个条件已经为真时,它不会检查其他条件。

代码

// It is possible, that both btNumber and ddSalutation are false, but it only checks for btNumber
// and then jumps out
fun isFormValid(): Boolean {
        var error = 0
            when {
                btNumber.value.isNullOrEmpty() -> {
                    btNumberEM.value = emptyFieldError
                    error = 1
                }
                btNumber.value.toString().length < 7 -> {
                    btNumberEM.value = btNumberTooFewChar
                    error = 1
                }
                ddSalutation.value == ddSalutationTextPlaceHolder -> {
                    ddSalutationEM.value = ddSalutationNotSelected
                    error = 1
                }
                etFirstName.value.isNullOrEmpty() -> {
                    etFirstNameEM.value = emptyFieldError
                    error = 1
                }
            }
            return error == 0
    }

我希望我的问题有意义。也许我没有正确理解when statements。这可能不起作用,因为:

如果用作语句,则各个分支的值是 忽略。 (就像 if 一样,每个分支都可以是一个块,它的值 是块中最后一个表达式的值。)~Jetbrains

我知道已经有同样的问题,但没有真正的答案来解决这个问题..

感谢每一个帮助,谢谢!

【问题讨论】:

  • 确实,如果条件为真,则不检查其他分支,这就是when 的工作原理。
  • 什么时候更换 Switch 或嵌套的 if-else 应该这样工作

标签: android kotlin


【解决方案1】:

whenthe way it's supposed to work 完全相同(强调我的):

when 按顺序将其参数与所有分支匹配直到满足某些分支条件

所以它最多执行一个分支,第一个匹配的分支,然后停止。

如果要继续匹配其他分支,只需使用一系列不相关的if 语句即可:

// It is possible, that both btNumber and ddSalutation are false, but it only checks for btNumber
// and then jumps out
fun isFormValid(): Boolean {
    var error = 0
    if (btNumber.value.isNullOrEmpty()) {
        btNumberEM.value = emptyFieldError
        error = 1
    }
    if (btNumber.value.toString().length < 7) {
        btNumberEM.value = btNumberTooFewChar
        error = 1
    }
    if (ddSalutation.value == ddSalutationTextPlaceHolder) {
        ddSalutationEM.value = ddSalutationNotSelected
        error = 1
    }
    if (etFirstName.value.isNullOrEmpty()) {
        etFirstNameEM.value = emptyFieldError
        error = 1
    }
    return error == 0
}

【讨论】:

  • 哦,我不知道,谢谢。但是有一个问题:是否可以跳过其中一个陈述?所以让我们说如果 btNumber 是 Empty 我不想检查它的长度是否
  • 使用if/else if
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多