diagnostics_no_default_cases 진단: enum switch에 default 절을 썼을 때
diagnostics_no_default_cases 진단: enum switch에 default 절을 썼을 때
Dart 분석기가 내보내는 진단에는 이름이 있어요. no_default_cases는 enum 값이나 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');
}
}