- Swift 5.1 기준
Enum AllCases를 얻어와 활용하고, 리팩토링하는 코드를 공유합니다.
예시 코드는 값을 switch 해야하는 버튼이 4개 있고, 각 버튼을 누를 때 원하는 text를 프린트 하는거예요.
enum case
우선 index값과 각 index에 해당하는 text를 enum으로 만들었어요.
enum DemoFlag {
case a0
case a1
case a2
case a3 public var rawValue: (index: Int, text: String) {
switch self {
case .a0: return (0, "Hi")
case .a1: return (1, "Hello")
case .a2: return (2, "World")
case .a3: return (3, "!")
}
}
}
DemoText Print
버튼을 누를 때 해당 버튼의 index 값을 파라미터로 줘서 DemoText를 Print 하는 함수예요. 우선 가장 간단하게 생각할 수 있는 방식으로 풀어썼어요. 결과값은 당연히 잘 나오겠지만, 코드가 너무 길고 case가 하나 늘어 날 때마다 함수를 계속 고쳐줘야하는 불편함이 있겠죠? 🥶
func printDemoText(_ index: Int) {
var demoText: String? // 로그 찍을 변수
switch index {
case DemoFlag.a0.rawValue.index:
demoText = DemoFlag.a0.rawValue.text
case DemoFlag.a1.rawValue.index:
demoText = DemoFlag.a1.rawValue.text
case DemoFlag.a2.rawValue.index:
demoText = DemoFlag.a2.rawValue.text
default:
demoText = DemoFlag.a3.rawValue.text
}
print("text = \(demoText)")
}
Enum 모든 Case 활용
Enum의 모든 Case 를 얻어와 반복문을 통해 코드를 리팩토링했어요.
// 1. 우선 enum에 allItems 값을 추가한다.
enum DemoFlag {
...
... static let allItems: [DemoFlag] = [.a0, .a1, .a2, .a3]
}// 2. printDemoText 함수 리팩토링
func printDemoText(_ index: Int) {
var demoText: String? // 로그 찍을 변수
DemoFlag.allItems.forEach {
if $0.rawValue.index == index {
demoText = $0.rawValue.text
}
print("text = \(demoText)")
}
많이 간결해졌죠? 🤩
하지만 이 경우에도 case가 추가될 경우 allItems 배열에 추가해줘야한다는 불편함이 있죠.
CaseIterable & Conclusion
그래서 검색하다가 알게된 CaseIterable
프로토콜. AllCases를 얻을 수 있어요.
enum: CaseIterable { // 추가
// static let allItems 는 지운다
}
func printDemoText(_ index: Int) {
var demoText: String? // 로그 찍을 변수
DemoFlag.allCases.forEach { // allCases를 가져올 수 있다.
if $0.rawValue.index == index {
demoText = $0.rawValue.text
}
print("text = \(demoText)")
}
이제 case가 추가되거나 사라져도 문제없겠죠! Swift는 참 멋진 언어인 것 같아요. 😃