Apakah Dart mendukung pencacahan?

91

Apakah Dart mendukung pencacahan? Misalnya:

enum myFruitEnum { Apple, Banana }

Pencarian sepintas dari dokumen menunjukkan tidak.

BraveNewMath
sumber
Iya. Dart mendukung Enums
MJ Montes

Jawaban:

156

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, switchpernyataan:

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}
Kai Sellgren
sumber
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

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

Günter Zöchbauer
sumber
4

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.

pengguna35443
sumber
Saya pikir untuk contoh ini, akan lebih baik untuk meninggalkan antarmuka dan menggunakan kelas. Antarmuka adalah abstraksi opsional dan
BraveNewMath
3

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._();
}
Alexandre Ardhuin
sumber
2

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;
    }
  }
}
BraveNewMath
sumber
2
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:

  enum fruits{
    BANANA, APPLE, ORANGE
  }
Beloin Sena
sumber
Nilai huruf kecil adalah standar.
Pete Alvin
0

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.

NabilJaran
sumber