(Swift) Enum AllCases를 활용한 리팩토링

Hanulyun
4 min readMay 14, 2020

--

  • 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는 참 멋진 언어인 것 같아요. 😃

--

--

Hanulyun
Hanulyun

Written by Hanulyun

iOS 주니어 개발자입니다. 개발하면서 막히는 부분을 해결한 후 기록으로 남깁니다. #Swift

No responses yet