연관된 상수들을 하나의 이름으로 묶은 타입
공통된 주제
에 대해서 이미 정해놓은 입력 값만 선택해서 받고 싶을 때 주로 사용하며 코드 가독성과 안정성이 높아진다. 또한 Heap에 저장되는 String과 달리, Enum은 값 형식으로 Stack에 저장되어 성능도 향상된다.
// 이렇게 변수로 선언 해서 사용할때마다 직접 입력해야하면
// 개수가 많아질수록 가독성과 안정성이 떨어진다.
var left = "left"
var right = "right"
var center = "center"
enum 자체가 하나의 독립적인 타입이 되므로 UpperCamelCase
로 적는다.
각 case는 lowerCamelCase
로 적고, 각각의 case도 고유의 형태로 취급된다.
// enum 정의 첫번째 방법
enum Alignment {
case left
case right
case center
}
// enum 정의 두번째 방법
enum Alignment {
case left, right, center
}
// 만들어둔 enum타입이 되고 .(점문법)으로 선언해둔 case에만 접근할 수 있다.
var left = Alignment.left
// 바꿀때에는 Alignment타입인걸 알고있기 때문에, 열거형의 이름은 생략가능하고 .(점문법)은 생략 불가능하다.
left = .center
switch-case문을 활용하면 열거형 타입을 잘 활용할 수 있다.
열거형 타입은 한정되어 있다고 컴파일러가 인지하기 때문에 case에 해당하는 모든 경우를 구현한다면, default를 적지 않아도 된다.
하지만 case에서 하나라도 빼고 작성한다면 default가 꼭 필요하다.
switch textAlignment {
case .left:
print("left")
case .center:
print("center")
case .right:
print("right")
}
케이스와 연관된 또 다른 값을 저장할때 사용한다.
원시값으로 사용 가능한 타입: String, Character, Number Type
// 원시값 저장 부분을 생략하면 지정한 타입마다 규칙에 따라 기본값이 저장됨
enum 타입이름: 원시값타입 {
case 케이스이름 = 원시값
}
enum Alignment: Int {
case left // 0
case right = 100
case center // 101
}
print(Alignment.left.rawValue) // 출력값: 0
print(Alignment.right.rawValue) // 출력값: 100
print(Alignment.center.rawValue) // 출력값: 101
Alignment.left.rawValue = 10 // Error: 원시값은 변경할 수 없음
enum Color: String {
case apple = "빨강"
case banana = "노랑"
case grape
}
// 이 때, 초기화가 된 값들은 호출 했을 때는 해당 값들을 불러오지만
// 포도와 같이 초기화가 되지 않은 값들은 case의 이름을 가져온다.
print("사과의 색은 \(Color.apple.rawValue)")
// 출력값: 사과의 색은 빨강
print("포도의 색은 \(Color.grape.rawValue)")
// 출력값: 포도의 색은 grape
// rawValue에 값이 없는 경우가 있기 때문에 변수로 사용하려면 옵셔널 타입으로 반환해야 한다.
let fruit: Color? = Color(rawValue: "보라")
print(fruit)
// 출력값: nil
if let color = Color(rawValue: "빨강") {
print("과일은 \(color)!")
} else {
print("해당 과일이 없습니다.")
}
// 출력값: 과일은 apple!
// Error: Character 타입의 원시값은 추론할 수 없기 때문에 직접 지정해주어야한다.
enum weekday: Character {
case monday
case tuesday
case wednesday
}
enum weekday: Character {
case monday = "m"
case tuesday = "t"
case wednesday = "w"
}
enum Month {
case mar, apr, may
case jun, jul, aug
case sep, oct, nov
case dec, jan, feb
func printMessage() {
switch self {
case .mar, .apr, .may:
print("봄")
case .jun, .jul, .aug:
print("여름")
default:
print("default")
}
}
}
var month = Month.apr
month.printMessage() // 출력값: 봄
month = .dec
month.printMessage() // 출력값: default