본문 바로가기
🍎 Swift/iOS 학습 노트

[Swift🍎] rawValue: 원시값

by 솔비님 2025. 2. 13.

enum 개념에 대해 복습 중에 궁금해서 찾아본 내용

 

 

enum의 각 case에 특정한 값(원시값, rawvalue)를 아래와 같이 할당하여 사용한다

enum Season: String {
    case spring = "봄"
    case summer // 원시값을 생략하면 case 이름과 같은 문자열이 자동으로 할당됨
    case autumn
    case winter
}

spring의 경우 "봄"이라는 값을 가지고 있다

나머지 summer, autumn, winter의 경우 별도의 값을 지정해 주지 않았으므로, case이름과 동일한 string 값을 갖게 된다

 

let season = Season.spring
print(season.rawValue) // 출력: 봄

Season.spring의 원시값은 "봄" 이므로 출력 시 "봄"이 출력된다

 

let season = Season.summer
print(season.rawValue) // 출력: summer

summer의 값은 따로 지정해주지 않았으므로 case이름과 동일한 "summer"가 출력된다

(따로 값을 지정해주지 않아도 원시값이라고 부른다)

 

 

⬇️ Int형의 경우

더보기

eunm Num: Int {

    case first = 1

    case second

    case third

}

 

일 경우 1씩 증가한다

second = 2

third = 3

 

 

값을 아예 지정해주지 않는 경우 0부터 1씩 올라간다

 

let newSeason = Season(rawValue: "봄")
print(newSeason) // 출력: Optional(Season.spring)

반대로, Season의 rawValue인 "봄"을 찾아보면 어떻게 될까?

Season의 원시값인 "봄"을 찾게되면, case spring에 연결된 값이므로 Season.spring이 반환되고 옵셔널로 감싸져 나오는걸 볼 수 있다

 

 

 

원시값이 있는데 왜 옵셔널로 감싸져서 반환될까?

 

 

 

 

 

그 이유는 init?(rawValue:)의 동작 방식에 있다

Swift에서 enum은 rawValue를 기반으로 인스턴스를 생성할 때 자동으로 옵셔널 생성자(init?)을 사용한다

 

주어진 rawValue가 "봄"이면 Season.spring를 반환하지만

rainy같은 존재하지 않는 값이라면 nil을 반환한다

 

주어진 rawValue가 유효하지 않을 수 있기 때문에 항상 Optional타입으로 반환하도록 설계되어 있다

 

 

Optional 없이 출력하려면

옵셔널 바인딩을 해주거나, 강제언래핑(사용자제), ??연산자를 사용하도록 한다

 

if let season = Season(rawValue: "봄") {
    print(season.rawValue) // "봄"
} else {
    print("해당하는 계절이 없습니다.")
}
func printSeason(_ rawValue: String) {
    guard let season = Season(rawValue: rawValue) else {
        print("해당하는 계절이 없습니다.")
        return
    }
    print(season.rawValue) // "봄"
}

printSeason("봄")  // "봄"
printSeason("rainy")  // "해당하는 계절이 없습니다."
print(Season(rawValue: "봄")?.rawValue ?? "값이 없습니다") // "봄"