Czy Dart obsługuje wyliczenia? Na przykład:
enum myFruitEnum { Apple, Banana }
Pobieżne przeszukanie dokumentów sugeruje, że nie.
Czy Dart obsługuje wyliczenia? Na przykład:
enum myFruitEnum { Apple, Banana }
Pobieżne przeszukanie dokumentów sugeruje, że nie.
Odpowiedzi:
Od wersji 1.8 możesz używać wyliczeń w następujący sposób:
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]);
}
Stare podejście przed 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);
}
Te stałe statyczne w klasie są stałymi czasu kompilacji i tej klasy można teraz używać na przykład w switch
instrukcjach:
var a = Fruit.APPLE;
switch (a) {
case Fruit.APPLE:
print('Yes!');
break;
}
const
nie zawsze jest możliwe (jeśli wyliczenie jest zbudowane z atrybutami, których nie można const
). Dlatego nie użyłem go w mojej odpowiedzi (chociaż czasami używam const
enum w moim kodzie).
List<Fruit> value
?
for (Fruit value in Fruit.values)
Z r41815 Dart ma natywną obsługę Enum, patrz http://dartbug.com/21416 i może być używany jak
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]}');
}
Wartość [Status.none, Status.running, Status.stopped, Status.paused]
: Status.none, indeks: 0
wartość: Status.running, indeks: 1
wartość: Status.stopped, indeks: 2
wartość: Status.paused, index: 3
działa: Status.running, 1
działa index: Status.running
Ograniczeniem jest to, że nie jest możliwe ustawienie wartości niestandardowych dla elementu wyliczeniowego, są one automatycznie numerowane.
Więcej szczegółów w tej wersji roboczej https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf
To i to mogą być odpowiedzi na Twoje pytanie:
... for the technology preview it was decided to leave it out and just
use static final fields for now. It may be added later.
Nadal możesz zrobić coś takiego:
interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }
//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }
który moim zdaniem jest bardziej przejrzysty w użyciu. Trochę trudniej jest zaprogramować strukturę aplikacji, ale w niektórych przypadkach jest to lepsze i przejrzyste.
Wyliczenie powinno być dostępne w przyszłości. Ale dopóki Enum nie wyląduje , możesz zrobić coś takiego:
class Fruit {
static final APPLE = new Fruit._();
static final BANANA = new Fruit._();
static get values => [APPLE, BANANA];
Fruit._();
}
co z tym podejściem:
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
. Następnie, gdybym chciał uzyskać tekstowe dane wyjściowe, miałbym mapę, która je tłumaczy lub osobno obsługę niektórych języków, gdybym chciał obsługiwać również inne języki. Myślę też, że switch
stwierdzenia działają najlepiej na liczbach całkowitych, ponieważ wtedy można je skompilować do tabeli skoków.
Tak! W rzeczywistości bardzo przydatne jest wykonywanie wyliczeń w Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Po prostu użyj pliku klas typów.
łatwe, szybkie, wydajniejsze i bardziej pomocne.
mały problem, ta klasa jest ograniczona do pięciu różnych wyborów i plus jeden dla działa jako zerowa.