Szukaj…


Uwagi

W przeciwieństwie do switch Java, instrukcja when nie ma zachowania awaryjnego. Oznacza to, że jeśli gałąź jest dopasowana, przepływ sterowania powraca po jego wykonaniu i nie jest wymagana instrukcja break . Jeśli chcesz połączyć bahaviors dla wielu argumentów, możesz napisać wiele argumentów oddzielonych przecinkami:

when (x) {
    "foo", "bar" -> println("either foo or bar")
    else -> println("didn't match anything")
}

Standardowa instrukcja if

val str = "Hello!"
if (str.length == 0) {
    print("The string is empty!")
} else if (str.length > 5) {
    print("The string is short!")
} else {
    print("The string is long!")
}

Pozostałe gałęzie są opcjonalne w normalnych instrukcjach if.

Instrukcja if jako wyrażenie

Instrukcje-if mogą być wyrażeniami:

val str = if (condition) "Condition met!" else "Condition not met!"

Zauważ, że else -branch nie jest opcjonalny, if -statement jest użyte jako wyrażenie.

Można to również zrobić w wariancie wieloliniowym z nawiasami klamrowymi i wieloma else if instrukcjami else if .

val str = if (condition1){
    "Condition1 met!" 
   } else if (condition2) {
    "Condition2 met!" 
   } else {
    "Conditions not met!"
   }

WSKAZÓWKA: Kotlin może wywnioskować dla ciebie typ zmiennej, ale jeśli chcesz być pewien, wpisz po prostu adnotację na zmiennej, np .: val str: String = to wymusi typ i ułatwi czytanie.

Instrukcja when zamiast łańcuchów if-else-if

Instrukcja when jest alternatywą dla instrukcji if z wieloma gałęziami else-if-:

when {
    str.length == 0 -> print("The string is empty!")
    str.length > 5  -> print("The string is short!")
    else            -> print("The string is long!")
}

Ten sam kod napisany przy użyciu łańcucha if-else-if :

if (str.length == 0) {
    print("The string is empty!")
} else if (str.length > 5) {
    print("The string is short!")
} else {
    print("The string is long!")
}

Podobnie jak w przypadku instrukcji if, gałąź else jest opcjonalna i możesz dodać dowolną liczbę gałęzi. Możesz także mieć oddziały wielowierszowe:

when {
    condition -> {
        doSomething()
        doSomeMore()
    }
    else -> doSomethingElse()
}

Dopasowanie argumentu kiedy-instrukcja

Po podaniu argumentu, when -statement dopasowuje argument przeciwko gałęziom w sekwencji. Dopasowanie odbywa się za pomocą operatora == , który wykonuje kontrole zerowe i porównuje operandy za pomocą funkcji equals . Pierwszy pasujący zostanie wykonany.

when (x) {
    "English" -> print("How are you?")
    "German" -> print("Wie geht es dir?")
    else -> print("I don't know that language yet :(")
}

Instrukcja when zna również bardziej zaawansowane opcje dopasowywania:

val names = listOf("John", "Sarah", "Tim", "Maggie")
when (x) {
    in names -> print("I know that name!")
    !in 1..10 -> print("Argument was not in the range from 1 to 10")
    is String -> print(x.length) // Due to smart casting, you can use String-functions here
}

Instrukcja-wyrażenie jako wyrażenie

Na przykład jeśli, kiedy może być również użyte jako wyrażenie:

val greeting = when (x) {
    "English" -> "How are you?"
    "German" -> "Wie geht es dir?"
    else -> "I don't know that language yet :("
}
print(greeting)

Aby zostać użyte jako wyrażenie, instrukcja when musi być wyczerpująca, tj. Albo mieć gałąź else, albo obejmować wszystkie możliwości gałęziami w inny sposób.

Oświadczenie z wyliczeniami

when można użyć do dopasowania wartości enum :

enum class Day {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

fun doOnDay(day: Day) {
    when(day) {
        Day.Sunday ->     // Do something
        Day.Monday, Day.Tuesday ->     // Do other thing
        Day.Wednesday ->  // ...
        Day.Thursday ->   // ...
        Day.Friday ->     // ...
        Day.Saturday ->   // ...
    }
}

Jak widać w wierszu drugiego przypadku ( Monday i Tuedsay ), możliwe jest również połączenie dwóch lub więcej wartości enum .

Jeśli twoje przypadki nie są wyczerpujące, kompilacja wyświetli błąd. Możesz użyć else do obsługi domyślnych przypadków:

fun doOnDay(day: Day) {
    when(day) {
        Day.Monday ->     // Work
        Day.Tuesday ->    // Work hard
        Day.Wednesday ->  // ...
        Day.Thursday ->   //
        Day.Friday ->     //
        else ->           // Party on weekend
    }
} 

Chociaż to samo można zrobić za pomocą konstrukcji „ if-then-else , when zajmuje się brakującymi wartościami enum i czyni je bardziej naturalnym.

Sprawdź tutaj, aby uzyskać więcej informacji na temat kotlin enum



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow