Dart는 열거를 지원합니까?


답변:


150

1.8 부터 다음과 같이 열거 형을 사용할 수 있습니다.

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(열거가 될 수 없다 속성으로 내장되어있는 경우 항상 가능한 것은 아니다 const). 그래서 나는 내 대답에 그것을 사용하지 않았습니다 (때로는 const내 코드에서 enum을 사용하지만 ).
Alexandre Ardhuin

확실히 스위치 문에서 사이비의 열거 형을 사용하는 것이 유용 할 수 있기 때문에 나는이 대답을 받아들이는 것
BraveNewMath

2
@KaiSellgren 참고 이제 스타일 가이드가 변경되었다고 생각하므로 열거 형 값은 모두 대문자가 아닌 소문자 카멜 케이스 여야합니다. dartlang.org/articles/style-guide/…
Greg Lowe

2
무엇입니까 List<Fruit> value?
Tom Russell

1
당신은 아마 쓰기를 의도했을 것입니다 for (Fruit value in Fruit.values). 그렇지 않으면 Dart가 오류를 보여줍니다
illright

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]
값 : Status.none, 인덱스 : 0
값 : Status.running, 인덱스 : 1
값 : Status.stopped, 인덱스 : 2
값 : Status.paused, 인덱스 : 3
실행 : Status.running, 1
실행 인덱스 : Status.running

제한 사항은 열거 형 항목에 대한 사용자 지정 값을 설정할 수 없으며 자동으로 번호가 지정된다는 것입니다.

이 초안에 대한 자세한 내용은 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 2012

0

예! 실제로 Dart에서 Enum을 수행하는 데 매우 유용합니다.

  enum fruits{
    BANANA, APPLE, ORANGE
  }

소문자 값이 표준입니다.
Pete Alvin

0

유형 클래스 파일을 사용하십시오.

다트 유형

쉽고, 빠르고, 더 강력하고, 더 유용합니다.

약간의 문제 가 있습니다.이 클래스는 5 개의 다른 선택으로 제한되고 1 개는 null로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.