열거형이란?
열거형은 연관된 값으로 이루어진 그룹을 하나의 타입으로 정의하는 것이다.
정해진 개수 안에서 정의 가능한 경우 사용한다.(요일, 방향, 가위 바위 보 등...)
Swift에서 기본적으로 제공하는 타입(Int, Double, String)과 달리 사용자가 직접 정의하는 Custom Type이다.
기존의 C나 Objective-C의 경우 열거형의 case 값들을 Integer로만 구성 가능하였으나, Swift에서는 String, Character, Integer, Float로 모두 구성 가능하다.
열거형 문법
열거형의 타입 이름은 대문자로 시작하고, 각 케이스 이름은 모두 소문자로 시작한다.
enum SomeEnumeration {
case 케이스명1
case 케이스명2
case 케이스명3
}
사용 예시
// 타입 정의
enum Weekday {
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
case sunday
}
// 한 줄에 선언도 가능
enum CompassPoint {
case north, south, east, west
}
// 사용
var today: Weekday = Weekday.monday
// 타입 추론을 사용할 수도 있음
// var today = Weekday.monday
위의 코드에서 변수 today는 이미 Weekday 타입으로 정의되어 있기 때문에 이후 다른 값을 할당할 때 축약형 문법을 사용할 수 있다.
(이미 해당 열거형 타입으로 선언된 변수만 가능!)
today = .friday
Switch문을 사용한 처리
각 열거형의 값을 switch문을 사용해 처리 가능하다.
이 때, 반드시 switch문은 열거형의 모든 값을 포함해야 한다.
단 하나의 케이스라도 누락된다면 코드가 컴파일되지 않는다.
switch today {
case .monday:
print("오늘은 월요일입니다.")
case .tuesday:
print("오늘은 화요일입니다.")
case .wednesday:
print("오늘은 수요일입니다.")
case .thursday:
print("오늘은 목요일입니다.")
case .friday:
print("오늘은 금요일입니다.")
case .saturday:
print("오늘은 토요일입니다.")
case .sunday:
print("오늘은 일요일입니다.")
}
열거형의 연관값(Associated Values)과 원시값(Raw Values)
원시값(Raw Values)
각 case에 raw 값을 저장할 수 있다.
// Int 타입의 raw 값
enum Weekday: Int {
case monday = 0
case tuesday = 1
case wednesday = 2
case thursday = 3
case friday = 4
case saturday = 5
case sunday = 6
}
// String 타입의 raw 값
enum Weekday: String {
case monday = "monday"
case tuesday = "tuesday"
case wednesday = "wednesday"
case thursday = "thursday"
case friday = "friday"
case saturday = "saturday"
case sunday = "sunday"
}
정수 타입의 경우, 원시값을 직접 지정해주지 않아도 자동으로 0, 1, 2 순으로 생성된다.
생성해 준 값을 기준으로 하나씩 커지며 생성된다.
enum Alignment: Int {
case left = 1
case center
case right
}
// prints "right"
print(Alignment(rawValue: 3)!)
// prints "center"
print(Alignment(rawValue: 2)!)
2를 기준으로 하나 큰 값인 3이 right의 원시값이 된다.
Optional(__lldb_expr_55.Alignment.left) -> 무슨말인지 모르겠으니... 나중에 정리
enum Alignment: Int {
case left = 0
case center = 2
case right
}
// prints "right"
print(Alignment(rawValue: 3)!)
// 참고
// 인스턴스 생성시 옵셔널 타입으로 리턴
let align = Alignment(rawValue: 0)
// prints Optional(__lldb_expr_55.Alignment.left)
print(align)
// 접근연산자를 통해 원시값 자체에도 접근 가능
let leftValue = Alignment.center.rawValue
// prints "2"
print(leftValue)
연관값(Associated Values)
연관값을 사용하면 열거형의 각 case에 추가적인 정보를 저장하는 것이 가능하다.
각 케이스별로 상이한 특징이 있고, 그것을 저장하고 활용할 필요가 있을 때 유용하게 쓰일 수 있다.
(클래스랑 뭐가 다른건지 잘 모르겠음 ... 정리 해볼 것)
enum Computer {
case cpu(core: Int, ghz: Double)
case ram(Int, String)
case hardDisk(gb: Int)
}
let myChip1 = Computer.cpu(core: 8, ghz: 3.5)
let myChip2 = Computer.cpu(core: 4, ghz: 2.0)
let myChip3 = Computer.ram(16, "DRAM")
let myChip4 = Computer.ram(4, "SRAM")
let myChip5 = Computer.ram(32, "DRAM")
let myChip6 = Computer.hardDisk(gb: 128)
let myChip7 = Computer.hardDisk(gb: 512)
연관값의 활용
var chip = Computer.cpu(core: 8, ghz: 2.0)
switch chip {
case .cpu(core: 8, ghz: 3.1):
print("CPU 8코어 3.1GHz입니다.")
case .cpu(core: 8, ghz: 2.6):
print("CPU 8코어 2.6GHz입니다.")
case .ram(32, _):
print("32기가램 입니다.")
default:
print("그 이외의 칩에는 관심이 없습니다.")
}
switch chip {
// case .cpu(let a, let b): 와 같은 표현(공통된 let을 밖으로 분리한 형태)
case let .cpu(a, b): // let a = 연관값, let b = 연관값
print("CPU \(a)코어 \(b)GHz입니다.")
case let .ram(a, _):
print("램 \(a)기가램 입니다.")
case let .hardDisk(a) :
print("하드디스크 \(a)기가 용량입니다.")
}
'IOS > Swift' 카테고리의 다른 글
| 옵셔널(Optional) - 1. 기초 (0) | 2023.05.23 |
|---|