Dart numaralandırmayı destekliyor mu?


Yanıtlar:


156

1.8'den başlayarak , şu şekilde numaralandırmaları kullanabilirsiniz:

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'den önceki eski yaklaşım:

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

Sınıftaki bu statik sabitler, derleme zamanı sabitleridir ve bu sınıf artık örneğin switchifadelerde kullanılabilir:

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

1
Kullanmak consther zaman mümkün değildir (enum, yapılamayan niteliklerle oluşturulmuşsa const). Bu yüzden constcevabımda kullanmadım ( kodumda bazen enum kullanmama rağmen ).
Alexandre Ardhuin

Bu yanıtı kabul edeceğim çünkü bir switch ifadesinde psuedo enum türünü kullanmak kesinlikle faydalı olacaktır
BraveNewMath

2
@KaiSellgren Not Stil kılavuzunun artık değiştiğini düşünüyorum, bu nedenle enum değerleri tüm büyük harfler yerine daha küçük deve durumu olmalıdır. Bkz dartlang.org/articles/style-guide/…
Greg Lowe

2
Nedir List<Fruit> value?
Tom Russell

1
Muhtemelen yazmak for (Fruit value in Fruit.values)
istediniz

9

R41815 ile Dart yerel Enum desteği aldı, bkz. Http://dartbug.com/21416 ve şu şekilde kullanılabilir:

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]
değeri: Status.none, indeks: 0
değer: Status.running, indeks: 1
değer: Status.stopped, indeks: 2
değer: Status.paused, dizin: 3
çalışıyor: Durum.çalışıyor, 1
çalışıyor dizin: Durum.çalışıyor

Bir sınırlama, bir enum öğesi için özel değerler ayarlamanın mümkün olmaması, otomatik olarak numaralandırılmalarıdır.

Bu taslakta daha fazla ayrıntı https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


4

Bu ve sorunuzun cevabı bu olabilir:

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

Yine de böyle bir şey yapabilirsiniz:

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

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

bence kullanım için daha açık. Uygulama yapısını programlamak biraz daha zordur, ancak bazı durumlarda daha iyi ve nettir.


Bence bu örnek için arayüzü dışarıda bırakıp bir sınıf kullanmak daha iyi olur. Arayüz isteğe bağlı bir soyutlamadır ve
BraveNewMath

3

Numaralandırma gelecekte mevcut olmalıdır. Ancak Enum inene kadar aşağıdakilere benzer bir şey yapabilirsiniz:

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

  static get values => [APPLE, BANANA];

  Fruit._();
}

2

bu yaklaşıma ne dersin:

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
Bunu kendim yapmazdım. Adı büyük harfle yazacaktı Fruit.APPLE. O zaman metinsel çıktı isteseydim, bunları çeviren bir haritam olurdu veya diğer dilleri de desteklemek istersem ayrı bir dil desteği alırdım. Ayrıca switchifadelerin en iyi tamsayılarda işe yaradığını düşünüyorum , çünkü o zaman bir atlama tablosuna derlenebilirler.
Kai Sellgren

1

Evet! Dart'ta Enums yapmak aslında çok yararlıdır:

  enum fruits{
    BANANA, APPLE, ORANGE
  }

Küçük harfli değerler standarttır.
Pete Alvin

0

Türler Sınıf Dosyasını kullanın.

Dart Türleri

kolay, hızlı, daha güçlü ve daha yararlı.

küçük sorun, bu sınıf beş Farklı Seçim ile sınırlı ve bir de boş olarak eylemler için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.