열거형의 원시값과 연관값

쏘스야·2023년 4월 4일
0

ios 개발자의 첫걸음

목록 보기
36/61
/**
 열거형의 원시값과 연관값
 */

/**
 열거형의 원시값
 */
// 정수가 자동으로 매겨짐.
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)기가 용량입니다.")
}
profile
개발자

0개의 댓글