Enum

Updated:

🔷 enum 케이스 나누기

  • enum 이란, type 을 나눈다고 보면 됨
// Swift 에서 enum 을 표현하는 정리합니다
// enum 은 category 를 나눈다고 생각하면 됨 예 학교 - 초, 중, 고 처럼
// School 은 값이 없이 case 만 나눈형식
enum School {
	// case elementary
	// case middle
	// case high
	// 한줄로 써도 됩니다
	case elementary, middle, high
}

// enum 에 접근해서 case 를 지정할 수 있습니다
let yourSchool = School.elementary
print("yourSchool: \(yourSchool)")// YourSchool: elementary

// enum 에 값을 넣어서 사용하기
enum Grade: Int {
	case first = 1
	case second = 2
}

let yourGrade = Grade.second
print("yourGrade : \(yourGrade)") // yourGrade: second
// rawValue 를 쓰면 enum 에서 선언한 값이 출력
print("yourGrade : \(yourGrade.rawValue)") // yourGrade: 2
// rawValue 를 사용하지 않고 값에 접근하기
enum SchoolDetail {
	case elementary(name: String)
	case middle(name: String)
	case high(name: String)
	// rawValue 인 name 만 추출해서 가져오는 method : 호출하면 String 을 return
	func getName() -> String {
		switch self {
		case .elementary(let name):
			return name
		case let .middle(name):
			return name
		case  .high(let name):
			return name
		}
	}
}

let yourMiddleSchoolName = SchoolDetail.middle(name: "Jacob Middle School")

print("yourMiddleSchoolName: \(yourMiddleSchoolName)") // yourMiddleSchoolName: middle(name: "Jacob Middle School")

// getName 을 사용해서 안에 name 만 추출하기
print("yourMiddleSchoolName: \(yourMiddleSchoolName.getName())") // yourMiddleSchoolName: Jacob Middle School

🔶 enum 타입에서 CaseIterable Protocol

CaseIterable Protocol 을 통해서도 enum type 에서도 collection 처럼 사용할 수 있습니다

enum Pet: String, CaseIterable {
	case cat = "고양이"
	case dog = "강아지"
}

// allCase 를 통해
// enum type 들을 collection 으로 가져 옵니다

let petKindCount = Pet.allCases.count
print("애완동물 종류 갯수: \(petKindCount)") // 애완동물 종류 갯수: 2

// 반복문도 가능합니다
for petTypeItem in Pet.allCases {
	print(petTypeItem.rawValue)
}
// 고양이
// 강아지

🔶 enum with associated value (값을 동반 한 enum)

// 애완동물 행동 enum
enum PetAction {
	case sleep // 잠자기
	case tailWagging // 꼬리 흔들기
	// enum 안에 value 를 넣을 수 있습니다
	case move(distance: Float) // 움직임
}

func doAction(_ action: PetAction) {
	switch action {
	case .sleep:
		print("강아지 자고 있음")
	case .tailWagging:
		print("강아지 꼬리 흔듬")
	case .move(let distance):
		// case let .move(distance): // 라고도 사용 가능함
		print("강아지가 \(distance) 만큼 움직임")
	}
}

doAction(.sleep) // 강아지 자고 있음
doAction(.tailWagging) // 강아지 꼬리 흔듬
doAction(.move(distance: 3.3)) // 강아지가 3.3 만큼 움직임
doAction(.move(distance: 0.5)) // 강아지가 0.5 만큼 움직임

🔷 enum rawValue 가져오기

Enum 에 생성자를 두어 rawValue 로 enumType 을 가져올 수 있습니다

enum PetType: String { // 애완동물 enum type
	case dog = "강아지"
	case cat = "고양이"
	case none

	// 생성자 생성
	init(value: String) {
		switch value {
		case "강아지": self = .dog
		case "고양이": self = .cat
		default: self = .none
		}
	}
}

// RawValue 로 enum 생성
let petType = PetType(rawValue: "강아지")
switch petType {
case .dog:
	print("강아지 입니다")
case .cat:
	print("고양이 입니다")
default:
	print("모릅니다")
}
// 강아지 입니다

🔷 nested enum

Enum 안에 enum 을 두어 사용이 가능합니다

enum MyFavoiteFood {
	case chocolate
	case porkBelly
	case pasta(ItalyPasta)

	// nested enum
	enum ItalyPasta {
		case carbornara
		case tomato
		case rose
	}
}


Reference

Swift official docs Enumerations- https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html

개발하는 정대리 스위프트 기초 문법 - 3일차 / enum 케이스 나누기 - https://www.youtube.com/watch?v=EXtpt5Skzck&list=PLgOlaPUIbynoqbQw_erl3L2w7vfOTCtFD

Categories:

Updated:

Leave a comment