switch по sealed class в Dart
Если переменная имеет запечатанный тип и в switch
перечислены все подтипы, ветка default не нужна.
Компилятор считает выражение полным так же, как для enum:
sealed class Result {}
final class Ok extends Result {
Ok(this.value);
final int value;
}
final class Err extends Result {
Err(this.code);
final int code;
}
Вызовем функцию для нового объекта:
String message(Result r) {
switch (r) {
case Ok(:final value):
return "ok $value";
case Err(:final code):
return "err $code";
}
}
print(message(Err(404)));
В ветке с нужным подтипом поля варианта доступны
прямо в шаблоне case - отдельное приведение
типа не требуется:
sealed class UiEvent {}
final class Refresh extends UiEvent {
const Refresh();
}
final class Click extends UiEvent {
Click(this.id);
final String id;
}
Вызовем функцию для нового объекта:
String handle(UiEvent event) {
switch (event) {
case Refresh():
return "reload";
case Click(:final id):
return "tap $id";
}
}
print(handle(Click("save")));
Конструкция switch может возвращать значение. Для запечатанного
типа с полным набором веток тип результата выводится
автоматически:
sealed class Shape {}
final class Circle extends Shape {
Circle(this.r);
final double r;
}
final class Square extends Shape {
Square(this.side);
final double side;
}
Вызовем функцию для нового объекта:
double perimeter(Shape s) {
switch (s) {
case Circle(:final r):
return 2 * 3.141592653589793 * r;
case Square(:final side):
return 4 * side;
}
}
print(perimeter(Square(5.0)));
Объявите sealed class Token:
Empty как final class без полей,
Bearer с полем value.
Напишите функцию header(Token t):
для Empty верните "",
для Bearer - строку "Bearer "
с подставленным value.
Выведите результат для Bearer("abc").
Объявите sealed class Move:
Up, Down, Left, Right
как final class без полей.
Дано:
var step = Left();
С помощью switch для переменной step
запишите в delta пару смещений по осям
x и y для этого шага
(Left - -1 по x,
остальные направления задайте сами).
Выведите delta.