Перечисления в Dart или enum представляют тип данны, который хранит фиксированный набор константных значений. Для определения перечисления применяется ключевое слово enum. Например, определим простейшее перечисление:
enum Operation{ add, subtract, multiply } void main (){ print(Operation.multiply); // Operation.multiply print(Operation.multiply.index); // 2 }
В данном случае определено перечисление Operation. Внутри блока перечисления перечисляются константы перечисления. В данном случае перемечисление Operation имеет три константы: add, subtract и multiply.
Для обращения к константам перечисления указывается название перечисления и через точку константа:
print(Operation.multiply);
Если мы попробуем вывести на консоль значение константы, то мы увидим фактически ее название - "Operation.multiply". Однако с каждой константой
также сопоставляется числовой индекс, который мы можем получить через поле index (Operation.multiply.index
).
Так, в данном случае константа Operation.multiply имеет индекс 2, потому что она определена третьей по порядку в перечислении. Первая константа
(в данном случае - add) имеет индекс 0, вторая - индекс 1 и так далее.
Каждое перечисление фактически определяет новый тип данных. Затем в программе мы можем определить переменную этого типа и использовать ее:
enum Operation{ add, subtract, multiply } void main (){ // создаем переменную перечисления Operation Operation op; // присваиваем значение op = Operation.add; print(op); // Operation.add print(op.index); // 0 }
Значением такой переменной является одна из констант этого перечисления.
Обычно переменная перечисления выступает в качестве хранилища состояния, в зависимости от которого производятся некоторые действия. Так, рассмотрим применение перечисления на более реальном примере:
enum Operation{ add, subtract, multiply } void main (){ // Тип операции задаем с помощью константы Operation.add runOperation(10, 5, Operation.add); // Тип операции задаем с помощью константы Operation.subtract runOperation(10, 5, Operation.subtract); // Тип операции задаем с помощью константы Operation.multiply runOperation(10, 5, Operation.multiply); } void runOperation(int x, int y, Operation op) { int result = 0; switch (op){ case Operation.add: result = x + y; case Operation.subtract: result = x - y; case Operation.multiply: result = x * y; } print("Результат операции равен $result"); }
Здесь функция runOperation в качестве параметров принимает два числа и тип операции. В функции main три раза вызывается runOperation, получая два числа и тип операции.
Консольный вывод программы:
Результат операции равен 15 Результат операции равен 5 Результат операции равен 50