# 열거형 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를 가지게 됩니다.
```

- String 으로 사용 할 경우 rawValue를 명시적으로 적용하지 않을 경우 case값을 그대로 뱉어낸다.

- Double값을 주게 될경우 정확히 기준을 세우기 어려워서 인지 원시값을 하나만 할당할 경우 다음을 알수가없다. 그렇기에 Double값을 적용하게 될경우 정확한 값을 할당 해줘야한다.

- 요렇게! 진행시켜!
### 야곰을 하면서 열거형 사용의 예시
#### 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()
```
