Dart có hỗ trợ liệt kê không?


Câu trả lời:


151

Bắt đầu từ 1.8 , bạn có thể sử dụng enum như sau:

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]);
}

Cách tiếp cận cũ trước 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);
}

Các hằng số tĩnh đó trong lớp là hằng số thời gian biên dịch và lớp này bây giờ có thể được sử dụng trong các switchcâu lệnh , ví dụ :

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}

1
constKhông phải lúc nào cũng có thể sử dụng (nếu enum được xây dựng với các thuộc tính không thể const). Đó là lý do tại sao tôi không sử dụng nó trong câu trả lời của mình (mặc dù đôi khi tôi sử dụng constenum trong mã của mình).
Alexandre Ardhuin

tôi sẽ được chấp nhận câu trả lời này vì chắc chắn nó sẽ hữu ích để sử dụng các loại psuedo enum trong một tuyên bố chuyển đổi
BraveNewMath

2
@KaiSellgren Lưu ý Tôi nghĩ rằng hướng dẫn kiểu hiện đã thay đổi, vì vậy các giá trị enum phải là chữ hoa camel thấp hơn thay vì tất cả các chữ hoa. Xem dartlang.org/articles/style-guide/…
Greg Lowe,

2
Là gì List<Fruit> value?
Tom Russell

1
Có thể bạn muốn viết for (Fruit value in Fruit.values), nếu không thì Dart hiển thị lỗi
sao cả.

9

Với r41815 Dart có hỗ trợ Enum gốc, hãy xem http://dartbug.com/21416 và có thể được sử dụng như

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]}');
}

Giá trị [Status.none, Status.running, Status.stopped, Status.paused]
: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, chỉ mục: 3
đang chạy: Status.running, 1
chỉ số đang chạy: Status.running

Một hạn chế là không thể đặt các giá trị tùy chỉnh cho một mục enum, chúng được đánh số tự động.

Thông tin chi tiết tại bản nháp này https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


4

Đâyđây có thể là câu trả lời cho câu hỏi của bạn:

... for the technology preview it was decided to leave it out and just 
use static final fields for now. It may be added later.

Bạn vẫn có thể làm điều gì đó như sau:

interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }

//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }

mà theo tôi là rõ ràng hơn để sử dụng. Việc lập trình cấu trúc ứng dụng khó hơn một chút, nhưng trong một số trường hợp, nó tốt hơn và rõ ràng hơn.


Tôi nghĩ đối với ví dụ này, sẽ tốt hơn nếu bỏ giao diện và sử dụng một lớp. Giao diện là một sự trừu tượng tùy chọn và
BraveNewMath

3

Bảng liệt kê sẽ có sẵn trong tương lai. Nhưng cho đến khi Enum hạ cánh, bạn có thể làm một số việc như:

class Fruit {
  static final APPLE = new Fruit._();
  static final BANANA = new Fruit._();

  static get values => [APPLE, BANANA];

  Fruit._();
}

2

còn cách tiếp cận này thì sao:

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;
    }
  }
}

2
Tôi sẽ không làm như thế này bản thân mình. Tôi sẽ giữ tên bằng chữ hoa như Fruit.APPLE. Sau đó, nếu tôi muốn đầu ra dạng văn bản, tôi sẽ có một bản đồ dịch chúng hoặc một số hỗ trợ ngôn ngữ riêng nếu tôi cũng muốn hỗ trợ các ngôn ngữ khác. Tôi cũng nghĩ rằng các switchcâu lệnh hoạt động tốt nhất trên số nguyên, vì sau đó chúng có thể được biên dịch xuống một bảng nhảy.
Kai Sellgren 19/12/12

0

Đúng! Nó thực sự rất hữu ích để làm Enums in Dart:

  enum fruits{
    BANANA, APPLE, ORANGE
  }

Giá trị chữ thường là tiêu chuẩn.
Pete Alvin

0

Chỉ cần sử dụng Tệp Loại Lớp.

Các loại phi tiêu

dễ dàng, nhanh chóng, mạnh mẽ hơn và hữu ích hơn.

vấn đề nhỏ, đó là lớp này được giới hạn trong năm Lựa chọn Khác nhau và cộng thêm một cho các hành động là null.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.