Поддерживает ли Dart перечисления? Например:
enum myFruitEnum { Apple, Banana }
Беглый поиск документации говорит о том, что нет.
Поддерживает ли Dart перечисления? Например:
enum myFruitEnum { Apple, Banana }
Беглый поиск документации говорит о том, что нет.
Ответы:
Начиная с 1.8 , вы можете использовать перечисления следующим образом:
enum Fruit {
apple, banana
}
main() {
var a = Fruit.apple;
switch (a) {
case Fruit.apple:
print('it is an apple');
break;
}
// get all the values of the enums
for (List<Fruit> value in Fruit.values) {
print(value);
}
// get the second value
print(Fruit.values[1]);
}
Старый подход до 1.8:
class Fruit {
static const APPLE = const Fruit._(0);
static const BANANA = const Fruit._(1);
static get values => [APPLE, BANANA];
final int value;
const Fruit._(this.value);
}
Эти статические константы внутри класса являются константами времени компиляции, и теперь этот класс можно использовать, например, в switch
операторах:
var a = Fruit.APPLE;
switch (a) {
case Fruit.APPLE:
print('Yes!');
break;
}
const
не всегда возможно (если перечисление построено с атрибутами, которых не может быть const
). Вот почему я не использовал его в своем ответе (хотя иногда я использую const
enum в своем коде).
List<Fruit> value
?
for (Fruit value in Fruit.values)
С r41815 Dart получил встроенную поддержку Enum, см. Http://dartbug.com/21416 и может использоваться как
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
print('running: ${Status.running}, ${Status.running.index}');
print('running index: ${Status.values[1]}');
}
[Status.none, Status.running, Status.stopped, Status.paused]
значение: Status.none, индекс: 0
значение: Status.running, index: 1
значение: Status.stopped, индекс: 2
значение: Status.paused, индекс: 3
работает: Status.running, 1
работает индекс: Status.running
Ограничение состоит в том, что невозможно установить собственные значения для элемента перечисления, они автоматически нумеруются.
Более подробная информация в этом проекте https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf.
Вот и это могут быть ответы на ваш вопрос:
... for the technology preview it was decided to leave it out and just
use static final fields for now. It may be added later.
Вы все еще можете сделать что-то вроде этого:
interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }
//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }
который, на мой взгляд, более понятен для использования. Программировать структуру приложения немного сложнее, но в некоторых случаях лучше и понятнее.
Перечисление должно быть доступно в будущем. Но пока Enum не приземлится, вы можете сделать что-то вроде:
class Fruit {
static final APPLE = new Fruit._();
static final BANANA = new Fruit._();
static get values => [APPLE, BANANA];
Fruit._();
}
как насчет этого подхода:
class FruitEnums {
static const String Apple = "Apple";
static const String Banana = "Banana";
}
class EnumUsageExample {
void DoSomething(){
var fruit = FruitEnums.Apple;
String message;
switch(fruit){
case(FruitEnums.Apple):
message = "Now slicing $fruit.";
break;
default:
message = "Now slicing $fruit via default case.";
break;
}
}
}
Fruit.APPLE
. Затем, если мне нужен текстовый вывод, у меня будет карта, которая переводит их, или некоторая языковая поддержка отдельно, если я хочу поддерживать и другие языки. Я также считаю, что switch
операторы лучше всего работают с целыми числами, потому что тогда они могут быть скомпилированы в таблицу переходов.
Да! На самом деле очень полезно делать Enums в Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Просто используйте файл классов типов.
проще, быстрее, мощнее и полезнее.
небольшая проблема, этот класс ограничен пятью разными вариантами выбора и плюс один для действий как null.