아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 32일차_열거형(2) 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 32일차_열거형(2)

바닐라머스크 2022. 2. 24. 22:42

지난 시간에 이어서 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)
}
두 열거형을 코딩했을때는 오류가 발생했고, 두번째 열거형에 ArithmeticExpression에 2를 붙였더니 오류가 사라짐


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

 

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.