Dart có hỗ trợ liệt kê không? Ví dụ:
enum myFruitEnum { Apple, Banana }
Tìm kiếm nhanh các tài liệu cho thấy không.
Dart có hỗ trợ liệt kê không? Ví dụ:
enum myFruitEnum { Apple, Banana }
Tìm kiếm nhanh các tài liệu cho thấy không.
Câu trả lời:
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 switch
câu lệnh , ví dụ :
var a = Fruit.APPLE;
switch (a) {
case Fruit.APPLE:
print('Yes!');
break;
}
const
Khô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 const
enum trong mã của mình).
List<Fruit> value
?
for (Fruit value in Fruit.values)
, nếu không thì Dart hiển thị lỗi
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
Đây và đâ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.
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._();
}
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;
}
}
}
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 switch
câ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.
Đúng! Nó thực sự rất hữu ích để làm Enums in Dart:
enum fruits{
BANANA, APPLE, ORANGE
}
Chỉ cần sử dụng Tệp Loại Lớp.
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.