Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtOpEsSS 81 of 113 menu
◀ ▶

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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить