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 ?? "값이 없습니다") // "봄"
'🍎 Swift > iOS 학습 노트' 카테고리의 다른 글
[Swift🍎] 타입 메서드와 타입 프로퍼티(Type Method, Type Property) 그리고 객체지향프로그래밍 (0) | 2025.02.20 |
---|---|
[Swift🍎] Struct&Enum에서 mutating의 역할 (0) | 2025.02.19 |
[Swift🍎] URLSession 뜯어보기 (0) | 2025.01.17 |
[Swift🍎] tableView, collectionView 식별자 간단하게 관리하기! (1) | 2024.10.31 |
[Swift🍎] RxSwift로 UITableView에 bind 하기 (0) | 2024.10.31 |