enum Weekday: String {
case 월요일 = "월요일"
case 화요일 = "화요일"
case 수요일 = "수요일"
case 목요일 = "목요일"
case 금요일 = "금요일"
case 토요일 = "토요일"
case 일요일 = "일요일"
}
// 금요일
Weekday.금요일
// 원시값 "금요일"
Weekday.금요일.rawValue
// 둘은 다른 타입의 값이다.
Swift에선 원시값과 관련하여 여러가지 편의성을 제공하는데
원시값으로 사용할 타입을 채택하고 원시값을 직접 정의해주지 않는다면
각 case에 적당한값을 자동으로 할당해줍니다.
원시값이 Number Type 타입일 경우
NumberType인 경우 case에 원시값을 지정해주지 않는다면 원시값이0 부터 시작하고 케이스가 바뀔때마다 정수 1 씩 증가한 원시값을 얻게된다.
enum Weekday: Int {
case 월요일 // 0
case 화요일 // 1
case 수요일 // 2
case 목요일 // 3
case 금요일 // 4
case 토요일 // 5
case 일요일 // 6
}
특정 케이스에는 직접 값을 지정하는 것도 가능하다.
특정 케이스에 값을 지정해주고 나머지 케이스에는 원시값을 지정해주지 않는다면 원시값을 지정한 케이스의 다음 케이스는 자동적으로
직전 케이스의 원시값에서 정수 1이 증가한 값을 가지게 된다.
enum Weekday: Int {
case 월요일 // 0
case 화요일 // 1
case 수요일 = 10
case 목요일 // 11
case 금요일 = 20
case 토요일 // 21
case 일요일 // 22
}
다만 원시값이 Double & Float 타입일 경우엔
특정 케이스에 값을 지정해줄 경우엔 Int타입과 차이가 있다.
NumberType의 경우 원시값이 지정되어 있지 않다면
직전 케이스의 원시값에서 정수 1을 증가시켜야 하는데
직전 값이정수값이 아닌 실수값이기 때문에 정수 1를 증가시키지 못한다.
enum Weekday: Double {
case 월요일 = 1.0
case 화요일 = 2.0
case 수요일 // 3.0 이 되지 못하고 에러 발생
case 목요일
case 금요일
case 토요일
case 일요일
}
따라서 실수값을 원시값으로 주는 경우엔 모든 케이스에 값을 주거나
enum Weekday: Double {
case 월요일 = 1.0
case 화요일 = 2.0
case 수요일 = 3.0
case 목요일 = 4.0
case 금요일 = 5.0
case 토요일 = 6.0
case 일요일 = 7.0
}
그 다음 케이스에 정수 값으로 주어야 한다.
enum Weekday: Double {
case 월요일 = 1.0
case 화요일 = 2.0
case 수요일 = 3 // 3.0
case 목요일 // 4.0
case 금요일 // 5.0
case 토요일 // 6.0
case 일요일 // 7.0
}
정수 값을 주어도 Double형으로 변환되어 들어간다.
원시값이 Character 타입일 경우
원시값이 Character인 경우엔모든 case의 원시값을 지정해주어야 한다
enum Weekday: Character {
case 월요일 = "a"
case 화요일 = "b"
case 수요일 = "c"
case 목요일 = "d"
case 금요일 = "e"
case 토요일 = "f"
case 일요일 = "g"
}
원시값이 Character 경우엔 당연하게 중복과 공백은 사용할 수 없다.
enum Weekday: Character {
case 월요일 = "a"
case 화요일 = "a" // 불가능
case 수요일 = "" // 불가능
case 목요일 = "d"
case 금요일 = "e"
case 토요일 = "f"
case 일요일 = "g"
}
원시값이 String 타입일 경우
원시값의 타입이 String일 때 원시값을 지정해주지 않는다면 case의 이름이 원시값으로 변경된다
enum Weekday: String {
case 월요일 // "월요일"
case 화요일 // "화요일"
case 수요일 // "수요일"
case 목요일 // "목요일"
case 금요일 // "금요일"
case 토요일 // "토요일"
case 일요일 // "일요일"
}
물론 특정 case만 지정해주는것도 가능하고 Character와는 다르게 공백문자도 사용가능하다.
// 지정해주는것도 가능
// 지정해주지 않으면 case 이름이 원시값
enum Weekday: String {
case 월요일, 화요일, 수요일, 목요일 // "월요일", "화요일", "수요일", "목요일"
case 금요일 = "Friday"
case 토요일 = "" // 공백문자도 사용가능
case 일요일 = "Sun day"
}
원시값이 있는경우 열거형 생성
열거형에 원시값이 있는경우엔 원시값으로 열거형을 생성할 수도 있습니다.
단원시값으로 열거형을 생성할 경우엔 옵셔널 타입이 됩니다.
왜냐하면 원시값에 맞는 case가 없을 수도 있기 때문이죠.
열거형에 없는 원시값으로 열거형을 생성했을때는 nil이 반환됩니다.
enum Weekday: Int {
case 월요일 // 0
case 화요일 // 1
case 수요일 // 2
case 목요일 // 3
case 금요일 // 4
case 토요일 // 5
case 일요일 // 6
}
var nilday: Weekday? = Weekday(rawValue: -1) // nil
var monday: Weekday? = Weekday(rawValue: 0) // 월요일
var tuesday: Weekday? = Weekday(rawValue: 1) // 화요일