새소식

인기 검색어

iOS/Swift

[Swift] 열거형의 원시값 (Raw Value) - Enum 2/3

  • -

원시값(Raw Value)

 

열거형은 원시값을 가질 수 있는데

열거형을 선언할때 원시값으로 사용할 타입을 채택해주고

각 case에 알맞은 원시값을 할당해주면 됩니다.

case의 .rawValue를 통해 원시값을 사용할 수 있습니다.

 

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) // 화요일

 

다음에는 열거형의 연관값(Associated Value) 알아보겠습니다.

 

 

https://junbok97.tistory.com/283

 

[Enum 1/3] 열거형(Enumeration)

오늘 공부 해볼것은 열거형입니다. Enumeration 이라고 하는데 Swift에서 자주 쓰이는 문법입니다. 열거형이란 ? The Swift Programming Language에서 정의된 열거형입니다. 좀 더 쉽게 설명하자면 타입 자체

junbok97.tistory.com

 

https://junbok97.tistory.com/284

 

[Enum 3/3] 열거형의 연관값 (Associated Value)

연관값(Associated Value) 열거형의 원시값의 단점은 모든 case가 동일한 타입의 원시값을 가져야 하고 case 별로 미리 지정된 하나의 값만을 가질 수 있다 는 것입니다. 이게 왜 단점이라고 생각하시는

junbok97.tistory.com

 

'iOS > Swift' 카테고리의 다른 글

[Swift] Generics(제네릭)  (2) 2023.06.10
[Swift] 열거형의 연관값 (Associated Value) - Enum 3/3  (0) 2023.06.09
[Swift] 열거형(Enumeration) - Enum 1/3  (1) 2023.06.03
[Swift] 진법 변환  (0) 2022.11.20
[Swift] 유니코드 변환  (0) 2022.11.03
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.