/**
열거형의 원시값과 연관값
*/
/**
열거형의 원시값
*/
// 정수가 자동으로 매겨짐.
enum Alignment: Int {
case left = 0
case center = 1
case right = 2
}
var alignString = Alignment.right.rawValue
var alignNum = Alignment(rawValue: 0)
// 문자로 사용
enum Alignment1: String {
case left = "L"
case center = "C"
case right = "R"
}
var rawValue1 = Alignment1.center.rawValue
var align1 = Alignment1(rawValue: "R")
enum RpsGame: Int {
case rock = 1
case paper = 2
case scissors = 3
}
// 없는 값은 nil 로 처리 가능
var r = RpsGame(rawValue: 5)
var p = RpsGame(rawValue: 2)
var s = RpsGame(rawValue: 3)
// 옵셔널 타입임.
print(p)
var number = Int.random(in: 1...100 % 3)
var choise = RpsGame(rawValue: number)
if let choi = choise {
print(choi) // 문자열이 아님. 주의
}
/**
열거형의 연관값
구체적인 추가정보를 제공하기 위해 사용
*/
// 무한대로 케이스를 만들수 있음
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.5)
let myChip3 = Computer.hardDisk(gb: 456)
let myChip4 = Computer.hardDisk(gb: 286)
let myChip5 = Computer.ram(12, "DRAM")
let myChip6 = Computer.ram(16, "SRAM")
/**
원시값과 연관값의 차이
- 1) 자료형 선언 방식: 선언하는 위치가 다름
- 2) 선언 형식: (1) 원시값 ===> 2가지중 1가지 선택 / (2)연관값 ===> 튜플의 형태로 형식 제한 없음
- 3) 값의 저장 시점: (원시값: 선언시점 / 연관값: 새로운 열거형 값을 생성할때 (인스턴스 생성시))
- 4) 서로 배타적: 하나의 열거형에서 원시값과 연관값을 함께 사용하는 것은 불가능 함
*/
/**
연관값의 활용
*/
var chip = Computer.cpu(core: 8, ghz: 2.0)
//chip = .ram(32, "DRAM")
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 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)기가 용량입니다.")
}