Mulai 1.8 , Anda dapat menggunakan enum seperti ini:
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 enumsfor (List<Fruit> value in Fruit.values) {
print(value);
}
// get the second valueprint(Fruit.values[1]);
}
Penggunaan consttidak selalu memungkinkan (jika enum dibangun dengan atribut yang tidak bisa const). Itulah mengapa saya tidak menggunakannya dalam jawaban saya (meskipun terkadang saya menggunakan constenum dalam kode saya).
Alexandre Ardhuin
saya akan menerima jawaban ini karena pasti akan berguna untuk menggunakan tipe enum psuedo dalam pernyataan switch
BraveNewMath
2
Catatan @KaiSellgren Saya pikir panduan gaya sekarang telah berubah, jadi nilai enum harus huruf kecil unta daripada huruf besar semua. Lihat dartlang.org/articles/style-guide/…
Greg Lowe
2
Apa List<Fruit> value?
Tom Russell
1
Anda mungkin bermaksud untuk menulis for (Fruit value in Fruit.values), jika tidak, Dart menunjukkan kesalahan
tepat
9
Dengan r41815 Dart mendapat dukungan Enum asli, lihat http://dartbug.com/21416 dan dapat digunakan seperti
... for the technology preview it was decided to leave it out and just
use staticfinal fields for now. It may be added later.
Anda masih bisa melakukan sesuatu seperti ini:
interfaceConnectionState{ }
classConnectedimplementsConnectionState{ }
classConnectingimplementsConnectionState{ }
classDisconnectedimplementsConnectionState{ }
//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }
yang menurut saya lebih jelas untuk digunakan. Ini sedikit lebih sulit untuk memprogram struktur aplikasi, tetapi dalam beberapa kasus, ini lebih baik dan jelas.
Saya tidak akan melakukannya sendiri. Saya akan menggunakan nama dalam huruf besar sebagai Fruit.APPLE. Kemudian jika saya menginginkan keluaran tekstual, saya akan memiliki peta yang menerjemahkannya atau beberapa dukungan bahasa secara terpisah jika saya ingin mendukung bahasa lain juga. Saya juga berpikir switchpernyataan bekerja paling baik pada bilangan bulat, karena kemudian mereka dapat dikompilasi ke tabel lompat.
Kai Sellgren
1
Iya! Ini sebenarnya sangat berguna untuk melakukan Enums in Dart:
Jawaban:
Mulai 1.8 , Anda dapat menggunakan enum seperti ini:
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]); }
Pendekatan lama sebelum 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); }
Konstanta statis di dalam kelas tersebut adalah konstanta waktu kompilasi, dan kelas ini sekarang dapat digunakan dalam, misalnya,
switch
pernyataan:var a = Fruit.APPLE; switch (a) { case Fruit.APPLE: print('Yes!'); break; }
sumber
const
tidak selalu memungkinkan (jika enum dibangun dengan atribut yang tidak bisaconst
). Itulah mengapa saya tidak menggunakannya dalam jawaban saya (meskipun terkadang saya menggunakanconst
enum dalam kode saya).List<Fruit> value
?for (Fruit value in Fruit.values)
, jika tidak, Dart menunjukkan kesalahanDengan r41815 Dart mendapat dukungan Enum asli, lihat http://dartbug.com/21416 dan dapat digunakan seperti
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]}'); }
Batasannya adalah tidak mungkin menyetel nilai kustom untuk item enum, mereka diberi nomor secara otomatis.
Rincian lebih lanjut di dalam draf ini https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf
sumber
Ini dan ini mungkin jawaban atas pertanyaan Anda:
... for the technology preview it was decided to leave it out and just use static final fields for now. It may be added later.
Anda masih bisa melakukan sesuatu seperti ini:
interface ConnectionState { } class Connected implements ConnectionState { } class Connecting implements ConnectionState { } class Disconnected implements ConnectionState { } //later ConnectionState connectionState; if (connectionState is Connecting) { ... }
yang menurut saya lebih jelas untuk digunakan. Ini sedikit lebih sulit untuk memprogram struktur aplikasi, tetapi dalam beberapa kasus, ini lebih baik dan jelas.
sumber
Pencacahan harus tersedia di masa mendatang. Tetapi sampai Enum mendarat, Anda dapat melakukan sesuatu seperti:
class Fruit { static final APPLE = new Fruit._(); static final BANANA = new Fruit._(); static get values => [APPLE, BANANA]; Fruit._(); }
sumber
bagaimana dengan pendekatan ini:
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; } } }
sumber
Fruit.APPLE
. Kemudian jika saya menginginkan keluaran tekstual, saya akan memiliki peta yang menerjemahkannya atau beberapa dukungan bahasa secara terpisah jika saya ingin mendukung bahasa lain juga. Saya juga berpikirswitch
pernyataan bekerja paling baik pada bilangan bulat, karena kemudian mereka dapat dikompilasi ke tabel lompat.Iya! Ini sebenarnya sangat berguna untuk melakukan Enums in Dart:
enum fruits{ BANANA, APPLE, ORANGE }
sumber
Cukup gunakan Jenis File Kelas.
Tipe Dart
mudah, cepat, lebih bertenaga, dan lebih bermanfaat.
Masalah kecil, kelas ini terbatas pada lima Pilihan Berbeda dan ditambah satu untuk bertindak sebagai null.
sumber