enum Weekday { // 타입 자체는 대문자로 선언
case monday // 내부적인 건 소문자로 정의
case tuesday
...
case sunday
}
enum CompassPoint {
case north, south, east, west
}
var today: Weekday = Weekday.monday
today = .friday // 앞에 Weekday 생략 가능. 이미 today에 Weekday라는 타입이 들어가는 게 명확함.
// 조건문에 사용할 수 있다
if today == .sunday {
}
// 주로 switch문으로 분기처리 가능
switch today {
case .monday :
print("월요일입니다")
case .tuesday :
print("화요일입니다")
...
}
// Int
enum Alignment: Int { // 타입을 써줌.
case left // 자동으로 값 매칭 (left = 0)
case center // center = 1
case right // right = 2
}
var align = Alignment(rawValue : 0) // 0은 left와 매칭되어 있기 때문에, left를 생성해준다
(var align = Alignment.left // 동일한 코드)
Alignment.center.rawValue // 1 반환
// String
enum Alignment1: String {
case left // 자동 매칭 "left"
case center // "center"
case right // "right"
}
// 활용 (가위 바위 보)
enum RpsGame: Int {
case rock
case paper
case scissors
}
// 생성자 이용해서 생성
RpsGame(rawValue: 0) // 주의 : Optional 값으로 반환함
var game = RpsGame(rawValue: 0) // 타입 : Optional
var game = RpsGame(rawValue: 0)! // 느낌표 붙여서 Optional 벗겨내 (느낌표 : 강제 추출. nill이 아닌 게 확실할 때 사용)
let number = Int.random(in: 0...100)%3
print(RpsGame(rawValue: number)!)
enum Computer {
case cpu(core: Int, ghz: Double) // named tuple
case ram(Int, String)
case hardDisk(gb: Int)
}
Computer.cpu(core: 4, ghz: 3.5) // 추가적인 정보 저장
Computer.cpu(core: 8, ghz: 6.0)
// 원시값으로 하면 -> 딱 하나밖에 저장 못한다. 불가능
enum Computer {
case cpu = "4 core 3.5 ghz)
case ram = "16 DRAM"
case hardDisk = 512
enum Optional<Wrapped> {
case some(Wrapped)
case none
}
var num: Int? = 7
enum Optional {
case some(Int)
case none
}
var n1 = Optional.some(7)
var n2 = Optinoal.none
// if let 바인딩을 애플이 이런 식으로 구현해두었다
switch num {
case .some(let a)
print(a)
case .none :
print("nill")
.none과 nill은 동일하다
enum SomeEnum {
case left
case right
}
let x : SomeEnum? = .left // 물음표를 붙여서 Optional 열거형으로 붙임.
// 값이 있는 경우 .some => 내부에 다시 .left / .right
// 값이 없는 경우 .none => nill
switch x {
case .some(let value) :
swtich value {
case .left :
print("왼")
case .right :
print("오")
}
case .none
print("전진")
}
// 두 번씩 벗기기가 불편하기 때문에 편의적 기능을 제공한다
switch x {
case .some(.left) :
print("왼")
case .some(.right) :
print("오")
case .none :
print("전진")
}
// switch문에서는 옵셔널 열거형 타입 사용할 때 벗기지 않아도 내부값 접근 가능하도록 해두었다
// 그냥 똑같이 써도 안에 값 접근 가능하다
// 단, 연관값인 경우는 안됨.
switch x {
case .left :
case .right :
case nill :