[Swift] Enumeration

임승섭·2023년 5월 15일
0

Swift

목록 보기
4/35
  • basic type
    • Int, Double, String, Bool, ...
  • Custom type (사용자 정의)
    • Enum(열거형), Class(클래스), Struct(구조체)

기본 개념

  • 타입 자체를 한정된 사례(case) 안에서 정의할 수 있는 타입
    • 월화수목금토일, 동서남북, 가위바위보, ...
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("화요일입니다")
    ...
}

원시값 / 연관값

원시값

  • 매칭되는 기본값을 정한다
  • Hashable한 타입 모두 사용 가능 (주로 Int, String 사용)
// 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

원시값 vs 연관값

  1. 선언하는 위치가 다름
  2. 선언 형식
  • 원시값 : 일반적으로 정수 or 문자열
  • 연관값 : tuple 형태로 형식 제한이 없음
  1. 값의 저장 시점
  • 원시값 : 선언 시점
  • 연관값 : 선언 후 새로운 열거형 value를 생성할 때
  1. 서로 배타적
  • 동시에 사용하는 것은 불가능하다

Optional 타입의 이해

  • 내부적으로 열거형으로 구현되어 있다.
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 :

0개의 댓글