switch 문이 모든 경우를 빠짐없이 처리하지 못하고 있어요

switch 문이 모든 경우를 빠짐없이 처리하지 못하고 있어요

exhaustive(완전한) 타입을 switch 로 분기할 때, 통과할 수 있는 가능한 값들 중 하나 이상에 대한 case 가 빠져 있으면 분석기가 알려주는 진단이에요.

출처: non_exhaustive_switch_statement

본문

exhaustive 타입을 switch 문으로 분기하는데, 그 타입을 통과할 수 있는 가능한 값들 중 하나 이상에 대한 case 가 빠져 있으면 이 진단이 발생해요.

아래 코드는 switch 문에 값 E.three 에 대한 case 가 없는데, E 가 exhaustive 타입이기 때문에 이 진단이 나와요.

enum E { one, two, three }

void f(E e) {
  switch (e) {
    case E.one:
    case E.two:
  }
}

고치는 방법

현재 매칭되지 않는 각 상수에 대해 case 를 하나씩 추가해 주면 돼요.

enum E { one, two, three }

void f(E e) {
  switch (e) {
    case E.one:
    case E.two:
      break;
    case E.three:
  }
}

빠진 값들을 매칭할 필요가 없다면, default 절이나 와일드카드 패턴을 추가하면 돼요.

enum E { one, two, three }

void f(E e) {
  switch (e) {
    case E.one:
    case E.two:
      break;
    default:
  }
}

다만 주의할 점이 있어요. default 절이나 와일드카드 패턴을 추가하면 그 exhaustive 타입에 나중에 추가되는 어떤 값도 함께 처리되게 돼요. 그래서 '이 switch 를 갱신해야 한다'는 컴파일러의 경고 능력을 잃게 되는 거죠.

더 알아보기

  • switch 문과 패턴 매칭에 대한 자세한 내용은 Dart 공식 문서의 pattern 자료를 참고해요.