O Dart suporta enumerações? Por exemplo:
enum myFruitEnum { Apple, Banana }
Uma pesquisa superficial dos documentos sugere que não.
O Dart suporta enumerações? Por exemplo:
enum myFruitEnum { Apple, Banana }
Uma pesquisa superficial dos documentos sugere que não.
Respostas:
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 switch
instruções:
var a = Fruit.APPLE;
switch (a) {
case Fruit.APPLE:
print('Yes!');
break;
}
const
nem 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 const
enum em meu código).
List<Fruit> value
?
for (Fruit value in Fruit.values)
, caso contrário, o Dart mostra um erro
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
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.
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._();
}
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;
}
}
}
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 switch
instruções funcionam melhor em inteiros, porque assim podem ser compiladas em uma tabela de salto.
Sim! Na verdade, é muito útil fazer Enums no Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Basta usar o arquivo de classe de tipos.
fácil, rápido, mais poderoso e mais útil.
probleminha, é essa classe limitada a cinco Different Choice e mais uma para atuar como nula.