Чи підтримує 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 Дарт отримав рідну підтримку 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, індекс: 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 in Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Просто використовуйте Файл класу типів.
легко, швидко, потужніше та корисніше.
невелика проблема, саме цей клас обмежений п’ятьма різними варіантами та плюс один для нульових дій.