# 열거형 Enum 이놈! 이놈 아저씨! 이노무 시키 - 열거형이란 하나의 주제로 연관된 데이터들의 맴버로 구성되어 있는 자료형 객체입니다. #### 열거형 코드 ```swift enum CompassPoint { case north case south case east case west } enum CompassPoint { case north, south, east, west } ``` 첫번째 코드와 두번째 코드는 같다. 열거형의 장점이다 열거형은 이런식으로 만들어서 사용을 한다. - 스위치 구문을 사용하여 열거형값 확인하기 ```swift var a = CompassPoint.north a = .east a = .south switch a { case .north: print("north") case .south: print("south") case .east: print("east") case .west: print("west") } // "south" 가 출력 ``` #### 열거형 케이스 반복 시키기 ```swift enum CompassPoint: CaseIterable { case north case south case east case west } for i in CompassPoint.allCases { print(i) } north south east west 이렇게 출력이 된다. ``` - CaseIterabl을 활용하여 열거형의 값들을 하나하나씩 사용할 수 있게 된다. #### 암시적으로 원시값 할당 ```swift enum Number: Int { case mercury = 1, venus, earth, mars, .... } Number.mercury 는 명시적으로 원시값 1을 가지고 Number.venus 는 2를 가지게 됩니다. ``` ![image](https://hackmd.io/_uploads/H1IR9ut4p.png) - String 으로 사용 할 경우 rawValue를 명시적으로 적용하지 않을 경우 case값을 그대로 뱉어낸다. ![image](https://hackmd.io/_uploads/Hk6gj_t4p.png) - Double값을 주게 될경우 정확히 기준을 세우기 어려워서 인지 원시값을 하나만 할당할 경우 다음을 알수가없다. 그렇기에 Double값을 적용하게 될경우 정확한 값을 할당 해줘야한다. ![image](https://hackmd.io/_uploads/S1zesdY46.png) - 요렇게! 진행시켜! ### 야곰을 하면서 열거형 사용의 예시 #### Namespace(네임스페이스) ```swift enum AlertNamespace { static let deleteTitle = "진짜요?" static let deleteMessage = "정말로 삭제하시겠어요?" static let networkErrorTitle = "네트워크 오류입니다" } showAlert(title: AlertNamespace.deleteTitle, message: AlertNamespace.deleteMessage, ``` - 전역으로 관리하고 있기에 열거형을 선택하여 사용하게 된다. - 각각의 상수나 변수에 명확한 식별자가 부여되기에 좋습니다. - 나름 유지보수에 용이할거 같습니다 #### 에러처리 ```swift enum DecodingError: Error { case fileNotFound case decodingFailure case unknown var message: String { switch self { case .fileNotFound: return "파일을 불러오지 못했습니다." case .decodingFailure: return "파일을 변환하지 못했습니다." case .unknown: return "알 수 없는 오류입니다." } } } guard let decodedData = try? decoder.decode(T.self, from: data) else { throw DecodingError.decodingFailure } ``` - 에러 처리시에 문구를 열거형으로 만들어 내어 사용할 수 있습니다. #### 카멜케이스에 의한 모델네이밍 변경 ```swift struct Coord: Decodable { let longitude: Double let latitude: Double private enum CodingKeys: String, CodingKey { case longitude = "lon" case latitude = "lat" } } 서버에서는 lon: ???, lat: ??? 이라는 키로 데이터 통신을 보내고 있기에 모델에서는 longitude, latitude 으로 만들어 정확한 네이밍을 한다. 이러하듯 열거형을 사용하여 네이밍을 정확히 하고 있습니다. ``` #### 뷰의 섹션을 나눌때도 사용이 가능! ```swift enum Section: Int, CaseIterable { case month case date case dreamItem } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { guard let section = Section(rawValue: section) else { return 0 } 섹션의 로벨류타입이 같으니깐 충분히 사용이 가능합니다~ switch section { case .month: return 1 case .date: return 1 case .dreamItem: return filterList.count } } ``` - 열거형을 사용하여 `numberOfRowsInSection`을 구분하여 나눌 수 있습니다. 어떻게 보면 네이밍이 생기게되니 가독성에 있어 좋아진다고 볼 수 있겠습니다. ```swift enum HTTPCode: Int { case OK = 200 case NOT_MoDIFY = 304 case INCORRECT_PAGE = 404 var value: String { return "HTTPCode Number is \(self.rawValue)" } func gerDescription() -> String { switch self { case .OK: return "응답이 성공했습니다, HTTP 코드는 \(self.rawValue)입니다." case .NOT_MoDIFY: return "변경된 내역이 없습니다. HTTP코드는 \(self.rawValue)입니다" case .INCORRECT_PAGE: return "존재하지 않는 페이지입니다. HTTP코드는 \(self.rawValue)입니다." } } static func getName() -> String { return "This Enumeration is HTTPCode" } } var a = HTTPCode.OK a = .NOT_MoDIFY a.value a.gerDescription() HTTPCode.getName() ``` ![image](https://hackmd.io/_uploads/HJ9D6OFV6.png)