Разбор sealed class в when в Kotlin
Если переменная имеет запечатанный тип и в when
перечислены все подтипы, ветка else не нужна.
Компилятор считает выражение полным так же, как для enum:
sealed class Result {
data class Ok(val value: Int) : Result()
data class Err(val code: Int) : Result()
}
fun message(r: Result): String = when (r) {
is Result.Ok -> "ok ${r.value}"
is Result.Err -> "err ${r.code}"
}
fun main() {
println(message(Result.Err(404)))
}
После ветки is Result.Ok внутри этой ветки
переменная r имеет тип Result.Ok -
тот же smart cast, что и при проверке is у
обычного наследника. Поля value и code
доступны без as:
sealed class UiEvent {
object Refresh : UiEvent()
data class Click(val id: String) : UiEvent()
}
fun handle(event: UiEvent) = when (event) {
UiEvent.Refresh -> "reload"
is UiEvent.Click -> "tap ${event.id}"
}
fun main() {
println(handle(UiEvent.Click("save")))
}
Ключевое слово when может возвращать значение. Для запечатанного
типа с полным набором веток тип результата выводится
автоматически:
sealed class Shape {
class Circle(val r: Double) : Shape()
class Square(val side: Double) : Shape()
}
fun perimeter(s: Shape): Double = when (s) {
is Shape.Circle -> 2 * Math.PI * s.r
is Shape.Square -> 4 * s.side
}
fun main() {
println(perimeter(Shape.Square(5.0)))
}
Объявите sealed class Token:
Empty как object,
Bearer с полем value: String.
Напишите функцию header(t: Token): String:
для Empty верните "",
для Bearer - строку "Bearer "
с подставленным value.
Выведите результат для Token.Bearer("abc").
Объявите sealed class Move:
Up, Down, Left, Right
как object.
Дано:
val step = Move.Left
С помощью when для переменной step
запишите в delta пару смещений по осям
x и y для этого шага
(Left - -1 по x,
остальные направления задайте сами).
Выведите delta.