Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Git
- cancelAsyncWrite
- ios
- userDefaults
- TableView
- Realm
- swift
- Threading
- 직장인인강
- 함수
- 기본문법
- switch
- beginAsyncWrite
- SeSAC
- Background
- 독학
- 패캠챌린지
- 인스펙터
- 30개프로젝트로배우는iOS앱개발withSwift초격자패키지Online
- 옵셔널 체이닝
- 열거형
- RawValue
- Optional Chaining
- 문자열 보간법
- 직장인자기계발
- xcode
- 프로퍼티 관찰자
- enum
- 패스트캠퍼스후기
- 패스트캠퍼스
Archives
- Today
- Total
아삭아삭 iOS 개발
[Swift 독학] 패스트캠퍼스 챌린지 32일차_열거형(2) 본문
지난 시간에 이어서 swift에서 강력한 기능 중 하나인 열거형에 대해 마저 알아보겠습니다.
열거형의 다양한 활용법들 중에는 원시값과 초기화, 메서드 활용, 재귀 열거형 등에도 가능합니다.
반응형
■ 열거형의 다양한 활용방법 6가지 (4) ~ (6)
4) 열거형의 원시값(rawValue)
- 열거형을 제일 처음 정의할 때 미리 설정해두는 초기값을 의미
- 열거형의 각 항목은 자체로도 하나의 값이지만 항목에 원시값을 갖게 할 수도 있음
※ 특정 타입으로 지정된 값을 가질 수 있음 - swift의 경우 원시값의 타입으로 문자열, 문자, 정수, 부동소수점 숫자 타입 등 다른 데이터 타입들도 가능
※ 단, 각 원시값은 열거형 선언부내 유일한 값이어야 함
※ 보통 다른 언어들에서는 Int타입만 원시값을 갖을 수 있음 - 열거형 이름 우측에 (원시값이 갖게 될)타입 명시 후, 케이스항목을 원시값으로 초기화 해주면 됨
- 정수나 문자열을 원시값으로 저장할 경우, 각 케이스의 모든값에 명시적으로 원시값을 할당해주지 않아도 됨
→ 원시값 미설정시 swift는 자동적으로 값 할당 가능
① 원시값이 정수일 경우, 첫번째 케이스에 값 미설정시 0으로 자동설정되며 이후부터 1씩 증가
② 원시값이 문자열인 경우, 각 케이스의 암시적인 값은 케이스명의 문자 - 초기화된 원시값을 사용하고 싶을 경우, raw value 프로퍼티로 원시값 접근 가능
→ 열거형 인스턴스를 생성할 때, 매개변수로 원시값을 넘겨주면 됨
→ case별로 각각 다른 값을 가져야 함
enum Country: Int {
case korea = 5, netherlands, italy, us, australia, luxemburg
}
enum CapitalCity: String {
case seoul, amsterdam, rome, washingtonDC, canberra, luxemburg
}
let country = Country.luxemburg.rawValue
// 10
let capitalcity = CapitalCity.amsterdam.rawValue
// amsterdam
- rawValue를 통해 원시값으로 초기화 가능
- rawValue를 통해 초기화한 인스턴스는 옵셔널 타입
∵ rawValue가 case에 해당하지 않을 수 있음
∵ 가능한 모든 Int 값으로 열거형 케이스를 찾지는 않음 - (원시값 타입으로 열거형 정의시) 열거형은 원시값 타입을 사용하는 초기화를 자동으로 수신하고 열거형 케이스(혹은 nil)을 반환함
- 초기화를 사용하여 열거형의 새 인스턴스 생성 가능
- 원시값 초기화는 항상 옵셔널 열거형 케이스를 반환
∵ 가능한 모든 Int 값으로 열거형 케이스를 찾지는 않음
// 7원시값으로 italy 식별 가능
let possibleCountry = Country(rawValue: 7)
// italy
// 99의 위치로 나라를 찾는다면 원시값 초기화로부터 반환된 옵셔널 Country값은 nil임
// 99의 원시값으로 나라를 찾기위해 옵셔널 바인딩 사용
// if let someCountry = Country(rawValue: countryToFind) 구문은 옵셔널 Country를 생성
// 옵셔널 Country의 값을 someCountry 에 설정함
// 근데 99의 위치에 행성값이 없으니까 else구문이 실행됨
let countryToFind = 99
if let someCountry = Country(rawValue: countryToFind) {
switch someCountry {
case .korea:
print("Amazing place to live with lots of good services")
default:
print("Nice to visit")
}
} else {
print("There is no decent place to live at position \(countryToFind).")
}
// There is no decent place to live at position 99.
5) 열거형의 메서드 활용
- func 키워드를 사용하여 열거형에서 메서드 활용 가능
enum Day {
case mon, tue
case wed, thur
case fri
case sat, sun
func sendMessage() {
switch self {
case .mon, .tue:
print("버텨..")
case .wed, .thur:
print("좀만 더 버텨..")
case .fri:
print("존버는 승리한다..")
case .sat, .sun:
print("무야호오우오오오오옹")
}
}
}
Day.fri.sendMessage()
// 존버는 승리한다..
6) 재귀 열거형(Recursive Enumeration)
- 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 갖는 열거형
- case앞에 indirect 키워드를 사용하여 활성화 가능
→ 컴파일러에게 필요한 간접계층을 삽입하도록 함 - enum앞에 indirect 키워드를 사용시, 연관값을 갖는 모든 열거형 케이스에 간접 활성화 가능
enum ArithmeticExpression {
case number(Int)
indirect case subtract(ArithmeticExpression, ArithmeticExpression)
indirect case divide(ArithmeticExpression, ArithmeticExpression)
}
indirect enum ArithmeticExpression2 {
case number(Int)
case subtract(ArithmeticExpression, ArithmeticExpression)
case divide(ArithmeticExpression, ArithmeticExpression)
}
let eighty = ArithmeticExpression.number(80)
let thirty = ArithmeticExpression.number(30)
let subtract = ArithmeticExpression.subtract(eighty, thirty)
let result = ArithmeticExpression.divide(subtract, ArithmeticExpression.number(10))
func calculate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .subtract(left, right):
return calculate(left) - calculate(right)
case let .divide(left, right):
return calculate(left) / calculate(right)
}
}
print(calculate(result))
// 5
본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
■ fast campus강의 외 참조자료
[1] https://blog.yagom.net/553/
[2] https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[Swift 독학] 패스트캠퍼스 챌린지 34일차_옵셔널 체이닝(2) (0) | 2022.02.26 |
---|---|
[Swift 독학] 패스트캠퍼스 챌린지 33일차_옵셔널 체이닝(1) (0) | 2022.02.25 |
[Swift 독학] 패스트캠퍼스 챌린지 31일차_열거형(1) (0) | 2022.02.23 |
[Swift 독학] 패스트캠퍼스 챌린지 30일차_익스텐션 (0) | 2022.02.22 |
[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜 (0) | 2022.02.21 |