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
Leave a comment