Enum(열거형)
- 열거형은 Swift에서 특정 주제나 종류에 따라 묶을 수 있는 값들을 그룹화하고 정의하여 데이터타입으로 사용할 수 있음.
- 관련된 값을 그룹화할 수 있음.
- enum 키워드와 코드블록을 사용하여 정의할 수 있음.
- 그룹화된 값은 enum의 코드블록 내에서 case를 사용하여 정의할 수 있음.
- 타입 안정성을 보장하고, 의도를 명확하게 파악할 수 있음.
- 정의한 enum은 데이터타입으로 사용할 수 있음.
- enum을 사용하여 만들어진 인스턴스는 Value Type.
// 기본 선언 방법
// enum 뒤에 열거형의 이름을 작성하고 코드블록 안에서 그룹화 된 값들을 case로 작성함.
enum Season { //Season enum을 선언.
case spring
case summer
case autumn
case winter //Season이 그룹화하여 갖고있는 값
}
// 기본 사용 방법
Season.spring // enum의 이름 뒤에 .을 찍고 데이터에 접근할 수 있음.
Season.summer
// 데이터 타입처럼 변수나 상수에 저장할 수 있음.
var season: Season = .spring // 데이터타입을 Season으로 명시하면
// Season.spring에서 Season 생략가능.
var summer = Season.summer // 데이터타입을 명시해서 값을 넣으면
// 컴파일러가 데이터 타입을 추론해줌.
summer = .spring // summer의 타입이 Season으로 판단되어
// Season.spring에서 Season을 생략할 수 있음.
enum Associated Values(연관값)
- 단순히 여러 값을 나열하는 것 이상의 기능을 제공.
- 추가적인 정보를 연관시켜 저장할 수 있는 기능.
- 각 case와 함께 타입을 지정하여 선언하면 연관값을 가질 수 있음.
// 선언 방법
// 택배 배송 상태를 관리하는 열거형
enum DeliveryStatus {
case ordered // 주문함
case shipping(trackingNumber: String) // 배달중의 상태로 연관값으로 String 타입의 trackingNumber를 저장함.
case deliveryCompleted(date: String) // 배달완료 상태로 연관값으로 String 타입의 data 정보를 저장함.
}
let status = DeliveryStatus.shipping(trackingNumber: "123")
print(status) // shipping(trackingNumber: "123")
switch status { // staus 값을 switch 코드블록에 넣음.
case .ordered: // .ordered 상태일 때 아래 코드를 실행함.
print("주문됨")
case .shipping(trackingNumber: let trackingNumber): // .shipping 상태일 때 아래코드 실행, 연관값은 trackingNumber 상수에 넣음.
print("배송중: \(trackingNumber)")
case .deliveryCompleted(date: let date): // .deliveryCompleted 상태일 때 아래 코드 실행, 연관값은 date 상수에 넣음.
print("배송완료: \(date)")
}
// 배송중 : 123
enum Raw Values(원시 값)
- 각 case 마다 기본으로 설정된 원시값을 저장할 수 있음.
- enum 이름 뒤에 콜론을 작성한 후 타입을 명시해주어야 함.
- case 뒤에 = 을 사용하여 원시값을 정해줄 수 있음.
- rawValue 를 사용하여 enum의 값을 만들 수 있음. 이 때는 매칭되는 rawValue가 없을 수 있기 때문에 Optional 값으로 나옴.
// Raw Values(원시값) 사용 방법
// 문자열의 Raw Value
// 이름(Season) 뒤에 : String을 붙여서 원시값을 String이라고 명시함.
enum Season: String {
case spring = "봄"
case summer // 값이 없다면 case 이름과 동일하게 됨.
case autumn = "가을"
case winter
}
let season = Season.spring
print(season.rawValue) // 봄
let season2 = Season.summer
print(season2.rawValue) // summer
// rawValue를 가지고 Season 상수(변수)를 만들 수 있음.
let newSeason = Season(rawValue: "가을")
print(newSeason) // Optional(autumn)
// 숫자형의 Raw Value
enum Month: Int {
case january = 1 // 값을 정해주지 않는다면 0부터 1씩 올라감
case february = 3
case march // 값을 정해주지 않아서 3 다음인 4가 됨.
case april // 값을 정해주지 않아서 5가 됨.
case may
case june
case july
case august
case september
case october
case november
case december
}
print(Month.january.rawValue)
print(Month.february.rawValue)
print(Month.march.rawValue)
print(Month.april.rawValue)
let month = Month(rawValue: 3)
print(month) // Optional(february)
- enum 에서 함수를 정의하고 사용할 수 있음.
enum Season: String {
case spring
case summer
case autumn
case winter
func weather() -> String {
switch self {
case .spring:
return "It is spring"
case .summer:
return "It is summer"
case .autumn:
return "It is autumn"
case .winter:
return "It is winter"
}
}
}
let season = Season.summer
print(season.weather()) // It is summer
Swift Convention Guide No.6 -> enum, class, struct 이름 짓는 방법
- enum, class, struct는 데이터타입으로 사용할 수 있으며, 이름은 대문자로 시작하는 Camel Case로 이름을 만들고 있음.