Dart รองรับการแจงนับหรือไม่


91

Dart รองรับการแจงนับหรือไม่ ตัวอย่างเช่น:

enum myFruitEnum { Apple, Banana }

การค้นหาเอกสารแบบคร่าวๆแสดงว่าไม่มี


1
code.google.com/p/dart/issues/detail?id=88 - ไม่ปรากฏ
จ้า

ใช่. Dart สนับสนุน Enums
MJ Montes

คำตอบ:


156

เริ่มต้น1.8คุณสามารถใช้ enums ดังนี้:

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

แนวทางเก่าก่อน 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);
}

ค่าคงที่ภายในคลาสเหล่านั้นเป็นค่าคงที่ของเวลาในการคอมไพล์และตอนนี้คลาสนี้สามารถใช้ในswitchคำสั่ง:

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

1
constไม่สามารถใช้งานได้เสมอไป (หาก enum สร้างขึ้นด้วยแอตทริบิวต์ที่ไม่สามารถconst) นั่นเป็นเหตุผลที่ฉันไม่ได้ใช้มันในคำตอบของฉัน (แม้ว่าบางครั้งฉันจะใช้constenum ในรหัสของฉัน)
Alexandre Ardhuin

ฉันจะยอมรับคำตอบนี้เพราะการใช้ประเภท psuedo enum ในคำสั่ง switch จะเป็นประโยชน์อย่างแน่นอน
BraveNewMath

2
@KaiSellgren หมายเหตุฉันคิดว่าตอนนี้สไตล์ไกด์เปลี่ยนไปแล้วดังนั้นค่า enum ควรเป็นตัวพิมพ์เล็กอูฐแทนตัวพิมพ์ใหญ่ทั้งหมด ดูdartlang.org/articles/style-guide/…
Greg Lowe

2
คืออะไรList<Fruit> value?
Tom Russell

1
คุณอาจตั้งใจจะเขียนfor (Fruit value in Fruit.values)มิฉะนั้น Dart จะแสดงข้อผิดพลาด
ต้อง

9

ด้วย r41815 Dart ได้รับการสนับสนุน Enum ดั้งเดิมโปรดดูที่http://dartbug.com/21416และสามารถใช้งานได้เช่น

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]
value: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, ดัชนี: 3
กำลังทำงาน: Status.running, 1
ดัชนีการทำงาน: Status.running

ข้อ จำกัด คือไม่สามารถกำหนดค่าที่กำหนดเองสำหรับไอเท็ม enum ได้ซึ่งจะถูกกำหนดหมายเลขโดยอัตโนมัติ

รายละเอียดเพิ่มเติมในร่างนี้https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


4

นี้และนี่อาจจะเป็นคำตอบในคำถามของคุณ:

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

คุณยังสามารถทำสิ่งนี้ได้:

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

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

ซึ่งในความคิดของฉันชัดเจนมากขึ้นสำหรับการใช้งาน การเขียนโปรแกรมโครงสร้างแอปพลิเคชันยากขึ้นเล็กน้อย แต่ในบางกรณีการเขียนโปรแกรมจะดีกว่าและชัดเจน


ฉันคิดว่าสำหรับตัวอย่างนี้มันจะดีกว่าที่จะละทิ้งอินเทอร์เฟซและใช้คลาส อินเทอร์เฟซเป็นนามธรรมที่เป็นทางเลือกและ
BraveNewMath

3

การแจงนับควรพร้อมใช้งานในอนาคต แต่จนกว่าEnum จะถึงฝั่งคุณสามารถทำสิ่งต่อไปนี้:

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

  static get values => [APPLE, BANANA];

  Fruit._();
}

2

แนวทางนี้เป็นอย่างไร:

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
ฉันคงไม่ทำแบบนี้ด้วยตัวเอง ฉันจะคงชื่อเป็นตัวพิมพ์ใหญ่เป็นFruit.APPLE. จากนั้นถ้าฉันต้องการผลลัพธ์ที่เป็นข้อความฉันจะมีแผนที่ที่แปลมันหรือรองรับภาษาบางภาษาแยกกันหากฉันต้องการรองรับภาษาอื่นด้วย ฉันยังคิดว่าswitchงบทำงานได้ดีที่สุดกับจำนวนเต็มเพราะสามารถรวบรวมลงในตารางกระโดดได้
Kai Sellgren


0

เพียงใช้ไฟล์ประเภทคลาส

ประเภทโผ

ง่ายรวดเร็วมีประสิทธิภาพและเป็นประโยชน์มากขึ้น

ปัญหาเล็กน้อยมันคือคลาสนี้ จำกัด ไว้ที่ห้าตัวเลือกที่แตกต่างกันและบวกหนึ่งสำหรับการกระทำเป็นโมฆะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.