Dart supporta le enumerazioni? Per esempio:
enum myFruitEnum { Apple, Banana }
Una rapida ricerca dei documenti suggerisce di no.
Dart supporta le enumerazioni? Per esempio:
enum myFruitEnum { Apple, Banana }
Una rapida ricerca dei documenti suggerisce di no.
Risposte:
A partire dalla 1.8 , puoi usare enumerazioni in questo modo:
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]);
}
Il vecchio approccio prima della 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);
}
Quelle costanti statiche all'interno della classe sono costanti del tempo di compilazione e questa classe può ora essere utilizzata, ad esempio, nelle switch
istruzioni:
var a = Fruit.APPLE;
switch (a) {
case Fruit.APPLE:
print('Yes!');
break;
}
const
non è sempre possibile (se l'enum è costruito con attributi che non possono essere const
). Ecco perché non l'ho usato nella mia risposta (anche se a volte uso const
enum nel mio codice).
List<Fruit> value
?
for (Fruit value in Fruit.values)
Con r41815 Dart ha il supporto Enum nativo, vedere http://dartbug.com/21416 e può essere utilizzato come
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]
valore: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running
Una limitazione è che non è possibile impostare valori personalizzati per un elemento enum, vengono numerati automaticamente.
Maggiori dettagli in questa bozza https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf
Questa e questa potrebbero essere le risposte alla tua domanda:
... for the technology preview it was decided to leave it out and just
use static final fields for now. It may be added later.
Puoi ancora fare qualcosa del genere:
interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }
//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }
che è secondo me più chiaro per l'uso. È un po 'più difficile programmare la struttura dell'applicazione, ma in alcuni casi è migliore e chiara.
L'enumerazione dovrebbe essere disponibile in futuro. Ma finché Enum non è atterrato puoi fare qualcosa come:
class Fruit {
static final APPLE = new Fruit._();
static final BANANA = new Fruit._();
static get values => [APPLE, BANANA];
Fruit._();
}
che ne dici di questo approccio:
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
. Quindi, se volessi l'output testuale, avrei una mappa che li traduce o un supporto linguistico separatamente se volessi supportare anche altre lingue. Penso anche che le switch
istruzioni funzionino meglio con gli interi, perché poi possono essere compilate in una tabella di salto.
Sì! In realtà è molto utile fare Enums in Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Usa semplicemente il file di classe dei tipi.
facile, veloce, più potente e più utile.
piccolo problema, questa classe è limitata a cinque Different Choice e più una per funge da null.