O Dart suporta enumerações?

87

O Dart suporta enumerações? Por exemplo:

enum myFruitEnum { Apple, Banana }

Uma pesquisa superficial dos documentos sugere que não.

BraveNewMath
fonte
sim. Dart apoia Enums
MJ Montes

Respostas:

150

A partir do 1.8 , você pode usar enums como este:

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]);
}

A abordagem antiga antes de 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);
}

Essas constantes estáticas dentro da classe são constantes de tempo de compilação, e essa classe agora pode ser usada, por exemplo, em switchinstruções:

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}
Kai Sellgren
fonte
1
Usar constnem sempre é possível (se o enum for construído com atributos que não podem ser const). É por isso que não usei em minha resposta (embora às vezes use constenum em meu código).
Alexandre Ardhuin
Aceitarei
2
@KaiSellgren Observação: acho que o guia de estilo agora mudou, então os valores enum devem ser minúsculos camel case em vez de maiúscula. Veja dartlang.org/articles/style-guide/…
Greg Lowe
2
O que é List<Fruit> value?
Tom Russell
1
Você provavelmente pretendia escrever for (Fruit value in Fruit.values), caso contrário, o Dart mostra um erro
claro
9

Com r41815, o Dart obteve suporte para Enum nativo, consulte http://dartbug.com/21416 e pode ser usado como

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.nenhum, Status.running, Status.stopped, Status.paused]
valor: Status.none, índice: 0
valor: Status.running, índice: 1
valor: Status.stopped, índice: 2
valor: Status.paused, índice: 3 em
execução: Status.running, 1
índice em execução: Status.running

Uma limitação é que não é possível definir valores personalizados para um item enum, eles são numerados automaticamente.

Mais detalhes neste rascunho https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Günter Zöchbauer
fonte
4

Esta e esta podem ser as respostas à sua pergunta:

... for the technology preview it was decided to leave it out and just 
use static final fields for now. It may be added later.

Você ainda pode fazer algo assim:

interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }

//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }

o que na minha opinião é mais claro para uso. É um pouco mais difícil para programar a estrutura do aplicativo, mas em alguns casos, é melhor e claro.

user35443
fonte
Acho que para este exemplo, seria melhor deixar a interface e usar uma classe. Interface é uma abstração opcional e
BraveNewMath
3

A enumeração deve estar disponível no futuro. Mas até Enum aterrissar, você pode fazer algo como:

class Fruit {
  static final APPLE = new Fruit._();
  static final BANANA = new Fruit._();

  static get values => [APPLE, BANANA];

  Fruit._();
}
Alexandre Ardhuin
fonte
2

que tal esta abordagem:

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;
    }
  }
}
BraveNewMath
fonte
2
Eu não faria isso sozinho. Eu manteria o nome em maiúsculas como Fruit.APPLE. Então, se eu quisesse uma saída textual, eu teria um mapa que os traduz ou algum suporte de idioma separadamente se eu quisesse oferecer suporte a outros idiomas também. Também acho que as switchinstruções funcionam melhor em inteiros, porque assim podem ser compiladas em uma tabela de salto.
Kai Sellgren
0

Sim! Na verdade, é muito útil fazer Enums no Dart:

  enum fruits{
    BANANA, APPLE, ORANGE
  }
Beloin Sena
fonte
Os valores em minúsculas são padrão.
Pete Alvin
0

Basta usar o arquivo de classe de tipos.

Tipos de dardo

fácil, rápido, mais poderoso e mais útil.

probleminha, é essa classe limitada a cinco Different Choice e mais uma para atuar como nula.

NabilJaran
fonte