enum
| topics | 500-모바일개발 503 Dart |
| types | 이론 레퍼런스 |
| tags | #dart #enum |
| references | ctoahn.tistory.com/27 dart.dev/language/enums |
Enum
Dart의 Enum 사용법이다.
기본 Enum
enum Status {
pending,
approved,
rejected,
}
// 사용
final status = Status.pending;
print(status.name); // 'pending'
print(status.index); // 0
Enhanced Enum (Dart 2.17+)
Dart 3.0 이후로 Enhanced Enum이 추가되어서 더 강력해졌다. 필드와 메서드를 가질 수 있어서 단순 상수 집합 이상의 역할을 할 수 있다.
enum Status {
pending('대기', Colors.grey),
approved('승인', Colors.green),
rejected('거절', Colors.red);
final String label;
final Color color;
const Status(this.label, this.color);
// 메서드도 가능
bool get isFinalized => this == approved || this == rejected;
}
// 사용
final status = Status.pending;
print(status.label); // '대기'
print(status.color); // Colors.grey
Enum에서 switch 사용
String getMessage(Status status) {
return switch (status) {
Status.pending => '처리 중입니다',
Status.approved => '승인되었습니다',
Status.rejected => '거절되었습니다',
};
}
장점: switch가 모든 case를 처리하는지 컴파일러가 확인해준다. case를 빠뜨리면 경고가 뜬다.
Enum과 JSON 변환
enum Status {
pending,
approved,
rejected;
// String → Enum
static Status fromString(String value) {
return Status.values.firstWhere(
(e) => e.name == value,
orElse: () => Status.pending,
);
}
}
// JsonSerializable과 함께
@JsonEnum(valueField: 'name')
enum Status {
pending,
approved,
rejected,
}
Enum 확장
extension StatusExtension on Status {
IconData get icon {
return switch (this) {
Status.pending => Icons.hourglass_empty,
Status.approved => Icons.check_circle,
Status.rejected => Icons.cancel,
};
}
}
Sealed Class vs Enum
| 특징 | Enum | Sealed Class |
|---|---|---|
| 각 값에 다른 필드 | X | O |
| 인스턴스 생성 | 고정 | 자유 |
| 패턴 매칭 | O | O |
언제 뭘 쓸까: 모든 값이 같은 구조면 Enum, 값마다 다른 데이터가 필요하면 Sealed Class
관련 문서
- dart 3.0 - 패턴 매칭, Sealed Class
- freezed,JsonSerialiable - JSON 변환