diagnostics_no_default_cases 진단: enum switch에 default 절을 썼을 때

diagnostics_no_default_cases 진단: enum switch에 default 절을 썼을 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. no_default_casesenum 값이나 enum과 비슷한 클래스의 인스턴스에 대해 switch 문을 쓸 때 default 절을 포함하면 분석기가 알려주는 진단이에요. enum을 다룰 땐 모든 경우를 case로 명시해 주는 게 안전하거든요.

출처: no_default_cases

본문

설명

분석기는 enum 값이나 enum과 비슷한(enum-like) 클래스의 인스턴스에 대한 switch 문에 default 절이 있을 때 이 진단을 만들어요. enum과 비슷한 클래스는 다음 조건을 만족하는 abstract가 아닌 클래스를 말해요.

  • private이고 factory가 아닌 생성자만 가지고 있어요.
  • 타입이 자기 자신(포함하는 클래스)인 static const 필드를 두 개 이상 가지고 있어요.
  • 선언한 라이브러리 안에 하위 클래스가 없어요.

예시

아래 코드는 enum 값 e에 대한 switch 문에 default 절이 있어서 이 진단을 만들어요.

enum E { a, b, c }

void f(E e) {
  switch (e) {
    case .a:
      print('a');
    default:
      print('other');
  }
}

다음 코드는 enum과 비슷한 클래스 C의 인스턴스인 c에 대한 switch 문에 default 절이 있어서 이 진단을 만들어요.

class const C._(final int i) {
  static const C a = ._(1);
  static const C b = ._(2);
  static const C c = ._(3);
}

void f(C c) {
  switch (c) {
    case .a:
      print('a');
    default:
      print('other');
  }
}

흔한 해결 방법

값이 enum 값이라면, default 절을 아직 처리하지 않은 enum 값들에 대한 case 절로 바꿔요.

enum E { a, b, c }

void f(E e) {
  switch (e) {
    case .a:
      print('a');
    case .b:
    case .c:
      print('other');
  }
}

값이 enum과 비슷한 클래스의 인스턴스라면, default 절을 아직 처리하지 않은 상수들에 대한 case 절로 바꿔요.

class const C._(final int i) {
  static const C a = ._(1);
  static const C b = ._(2);
  static const C c = ._(3);
}

void f(C c) {
  switch (c) {
    case .a:
      print('a');
    case .b:
    case .c:
      print('other');
  }
}

더 알아보기