Swift 열거형(Enum)

미니·2022년 4월 22일
0

Swift 문법

목록 보기
3/6
post-thumbnail

스위프트는 프로그래머가 설정한 값의 모음의 데이터 형태를 지원한다. 이를 우리는 열거형(Enum)이라고 명명했다.
열거형은 프로그래머가 설정한 값 이외의 값을 추가 및 수정이 불가능하다.

기본 열거형

열거형은 아래와 같은 경우 잘 활용할 수 있다.
1. 제한된 선택지를 주고 싶은 경우
2. 정해진 값 외에는 받고 싶지 않을 경우
3. 예상된 입력 값이 한정되어 있는 경우

예를 들어서 지역을 "도/시/읍명동"으로 나누어서 받아야하는 상황에서 '도'에 해당되는 값을 열거형으로 표현이 가능할 것이다.

enum Dong{
    case gyeongGi
    case seoul
    case inCeon
    case chungCheong
    case dajeon
    case seJong
    case jeolLa
    case gwangJu
    case gyeongSang
    case daeGu
    case buSan
    case gangWon
    case jeJu
}

var myDong:Dong = .gyeongGi

원시 값을 가진 열거형

열거형의 각 항목은 하나의 값이지만, 원시값을 가질 수 있다. 즉, 특정 타입으로 지정된 값을 가질 수 있다.

enum Dong:String{
    case gyeongGi = "경기도"
    case seoul = "서울특별시"
    case inCeon = "인천광역시"
    case chungCheong = "충청도"
    case dajeon = "대전광역시"
    case seJong = "세종특별자치시"
    case jeolLa = "전라도"
    case gwangJu = "광주광역시"
    case gyeongSang = "경상도"
    case daeGu = "대구광역시"
    case buSan = "부산광역시"
    case gangWon = "강원도"
    case jeJu = "제주특별자치시"
}

let myPlace:Dong = .gyeongGi
print("저는 \(myPlace.rawValue)에 살고 있습니다.") //저는 경기도에 살고 있습니다.

열거형의 원시값에 접근하기 위해서는 rawValue 프로퍼티를 통해서 접근이 가능하다.
또한 원시값에 대해서 모두 지정해줘야하는 것은 아니며, 자동 완성이 가능하다.

enum Numbers:Int{
    case zero
    case one
    case two
    case ten = 10
}
print("\(Numbers.zero.rawValue)") //0

열거형의 원시값을 ten만 지정했지만, zero의 원시값이 0이 나오는 것을 확인할 수 있다.

연관값을 가진 열거형

열거형 내의 항목은 자신과 연관되어 있는 값을 가질 수 있다. 연관 값은 각 항목 옆에 소괄호를 통해서 생성할 수 있다.

enum Menu{
    case pasta(taste:String)
    case chicken(withSauce:Bool)
    case rice
}

var dinner:Menu = .pasta(taste: "크림")
print(dinner.rawValue) //pasta(taste: "크림")

연관값도 제한해야만 하는 경우가 있을 수 있다. 이런 경우에는 연관값에 열거형을 활용하는 방법이 있다.

enum PastaTaste{
    case cream,tomato
}

enum Menu{
    case pasta(taste:PastaTaste)
    case chicken(withSauce:Bool)
    case rice
}

var dinner:Menu = .pasta(taste: .cream) //

항목 순회

열거형의 모든 케이스의 값을 알아야하는 경우가 있을 수 있다. 우리는 CaseIterable 프로토콜을 채택하여 구현이 가능하다.

enum Dong:String,CaseIterable{
    case gyeongGi = "경기도"
    case seoul = "서울특별시"
    case inCeon = "인천광역시"
    case chungCheong = "충청도"
    case dajeon = "대전광역시"
    case seJong = "세종특별자치시"
    case jeolLa = "전라도"
    case gwangJu = "광주광역시"
    case gyeongSang = "경상도"
    case daeGu = "대구광역시"
    case buSan = "부산광역시"
    case gangWon = "강원도"
    case jeJu = "제주특별자치시"
}

let allCases:[Dong] = Dong.allCases

하지만 이와 같이 간단한 경우의 열거형만 존재하는 것은 아니다. 이중으로 열거형이 지정되어 있거나 조건에 따라 열거형의 값이 변경되어야하는 경우 등이 존재할 수 있다. 이럴 때에는 열거형 내의 프로퍼티를 생성해주는 방법을 통해서 해결이 가능하다. 아래의 예는 연관값으로 열거형을 받는 예시 이다.

enum PastaTaste:CaseIterable{
    case cream,tomato
}

enum Menu:CaseIterable{
    case pasta(taste:PastaTaste)
    case chicken(withSauce:Bool)
    case rice
    
    static var allCases: [Menu]{
        return PastaTaste.allCases.map(Menu.pasta)
        + [true,false].map(Menu.chicken)
        + [Menu.rice]
    }
}

var dinner:[Menu] = Menu.allCases
print(dinner.count) //5

참고 : 스위프트 프로그래밍 (저자 - 야곰)

profile
IOS 개발자 지망생

0개의 댓글