Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
У Kotlin есть ключевое слово when, которое заменяет оператор switch и позволяет делать более сложные вещи. Выражение when имеет больше возможностей, чем классический switch и позволяет использовать объекты.
Допустим, мы хотим создать мнемоническое правило для цветов радуги: Кот-охотник желает знать, где сидят фазаны.
fun getMnemonic(color: Color) =
when (color) {
Color.RED -> "кот"
Color.ORANGE -> "охотник"
Color.YELLOW -> "желает"
Color.GREEN -> "знать"
Color.BLUE -> "где"
Color.INDIGO -> "сидят"
Color.VIOLET -> "фазаны"
}
println(getMnemonic(Color.INDIGO))
// выводит: сидят
В примере мы создали функцию, которой присвоили значение, возвращаемое when. В Java мы так не можем писать. Нам пришлось бы создавать отдельный блок кода switch, не связанный с каким-то методом. В Kotlin такой вариант также возможен при желании.
Вам не нужно использовать break, как в Java. Для комбинирования разных веток используйте запятые.
fun getWarmth(color: Int) = when(color){
RED, YELLOW -> "warm"
GREEN -> "neutral"
BLUE -> "cold"
else -> "unknown"
}
println(getWarmth(GREEN))
// выводит: neutral
В примере используются укороченные имена цветов из перечисления Color. Перечисление вынесено в область импорта.
import android.graphics.Color.*
Вместо перечислений можно использовать и обычные переменные.
В примере используется ключевое слово else, который является аналогом default и ему передаётся значение, когда ни одно из выражений не выполнится.
Например, мы можем отслеживать видимость компонента ImageView.
button.setOnClickListener(View.OnClickListener {
// сделаем невидимым
catImageView.visibility = View.INVISIBLE;
// смотрим
when(catImageView.visibility){
View.VISIBLE -> println("visible")
View.INVISIBLE -> println("invisible")
else -> println("gone")
}
})
В предыдущих примерах возвращаемый результат присваивался функции или использовался сам по себе. Также можно присвоить и обычной переменной.
var x = 5
val result = when (x) {
0, 1 -> "binary"
else -> "error"
}
println(result)
В выражении when можно использовать ключевое слово is для проверки принадлежности к экземпляру класса.
fun describe(obj: Any): String =
when (obj) {
1 -> "Единица"
is Cat -> "Кот!"
"Hello Kitty" -> "Приветствуем котика"
is Long -> "Long"
!is String -> "Не строка"
else -> "Unknown (Неведома зверушка)"
}
class Cat(val name: String)
val barsik = Cat("Барсик")
println(describe(45))
println(describe("Васька"))
println(describe(475L))
println(describe(1))
println(describe(barsik))
// Результат
Не строка
Unknown (Неведома зверушка)
Long
Единица
Кот!
Можно задействовать интервалы in:
val zarplata = 1000
val cost = when (zarplata) {
in 1..10 -> "издеваетесь?"
in 10..100 -> "маловато будет"
in 100..1000 -> "кота прокормлю"
in 1000..1000000 -> "на хлеб с икрой!"
else -> "not rated"
}
println(cost)