Apakah Dart mendukung pencacahan? Misalnya:
enum myFruitEnum { Apple, Banana }
Pencarian sepintas dari dokumen menunjukkan tidak.
Apakah Dart mendukung pencacahan? Misalnya:
enum myFruitEnum { Apple, Banana }
Pencarian sepintas dari dokumen menunjukkan tidak.
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;
}
const
tidak selalu memungkinkan (jika enum dibangun dengan atribut yang tidak bisa const
). Itulah mengapa saya tidak menggunakannya dalam jawaban saya (meskipun terkadang saya menggunakan const
enum dalam kode saya).
List<Fruit> value
?
for (Fruit value in Fruit.values)
, jika tidak, Dart menunjukkan kesalahan
Dengan 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]}');
}
[Status.none, Status.running, Status.stopped, Status.paused]
nilai: Status.none, indeks: 0
nilai: Status.running, indeks: 1
nilai: Status.stopped, indeks: 2
nilai: Status.paused, indeks: 3
berjalan: Status.running, 1
running index: Status.running
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
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.
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._();
}
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;
}
}
}
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 switch
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
}
Cukup gunakan Jenis File Kelas.
mudah, cepat, lebih bertenaga, dan lebih bermanfaat.
Masalah kecil, kelas ini terbatas pada lima Pilihan Berbeda dan ditambah satu untuk bertindak sebagai null.