ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Enumeration 총정리
    iOS/🟠 Swift 2021. 3. 10. 12:16

    - 1μ°¨ μˆ˜μ • (2021.03.29)

    - 2μ°¨ μˆ˜μ • (2021.05.07)

     

    μ—΄κ±°ν˜•μ„ κ³΅μ‹λ¬Έμ„œλ₯Ό 톡해 정리λ₯Ό ν•˜κ³  μ—¬λŸ¬ 번 λ³΅μŠ΅ν•˜λ©΄μ„œ λ†“μΉœ λ‚΄μš©μ΄λ‚˜ μƒˆλ‘œ κΉ¨λ‹«κ²Œ 된 점을 κΈ€λ‘œ λ‚¨κΉλ‹ˆλ‹€. πŸ‘πŸ»

     

    자료: Enumerations

     


    κΈ°λ³Έ Syntax

    enum Direction {
      case north, south, east, west
    }
    
    // ν˜Ήμ€
    
    enum Direction {
      case north
      case south
      case east
      case west
    }

     

    μ—΄κ±°ν˜•μ„ μ„ μ–Έν•˜λŠ” 것은 μƒˆλ‘œμš΄ μ»€μŠ€ν…€ νƒ€μž…μ„ λ§Œλ“œλŠ” 것이고, κ·Έ νƒ€μž…μ΄ κ°€μ§ˆ 수 μžˆλŠ” 값듀을 μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

     

    μœ„ μ½”λ“œμ— λ”°λ₯΄λ©΄ Direction νƒ€μž…μ€ north, south, east, west λΌλŠ” κ°’λ§Œ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

    λ‹€λ₯Έ 값을 μ‚¬μš©ν•˜λ €κ³  ν•˜λ©΄ 컴파일 μ—λŸ¬μž…λ‹ˆλ‹€.

     

    κ·Έλ ‡λ‹€λ©΄ μ–Έμ œ μ—΄κ±°ν˜•μ„ μ‚¬μš©ν• κΉŒμš”?

     

    ν•œ 가지 예둜 슀트링 λ¦¬ν„°λŸ΄ λŒ€μ‹  λŒ€μ‹  μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜μ—¬ switch 문의 caseλ₯Ό λ§€μΉ­μ‹œν‚€λ©΄, 보닀 μ•ˆμ „ν•œ μ½”λ“œκ°€ λ©λ‹ˆλ‹€.

    μŠ€νŠΈλ§μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” μ˜€νƒ€λ₯Ό 방지할 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

     

    λ˜ν•œ Error νƒ€μž…μ„ μ •μ˜ν•  λ•Œλ„ μ—΄κ±°ν˜•μ„ 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€.


     

    λ‹€λ₯Έ μ–Έμ–΄μ™€λŠ” λ‹€λ₯Έ Swift μ—΄κ±°ν˜•μ˜ νŠΉμ§•

    var whertToGo = Direction.north
    
    switch wherToGo {
    
      case .north:
        print("Go to the North")
      default:
        print("Have no idea")
    }
    
    //C μ–Έμ–΄ μ—μ„œλŠ” μ •μˆ˜ κ°’μœΌλ‘œλ„ switch λ¬Έμ—μ„œ λΆ„κΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    switch (whereToGo) {
    
      case 0:
        ...
    }

    κΈ°λ³Έ Syntax 둜 μ—΄κ±°ν˜•κ³Ό caseλ₯Ό μ„ μ–Έν•˜μ˜€μ„ λ•Œ, caseλŠ” κ·Έ 자체 κ°’λ§Œμ„ 가지고, κ·Έ 외에 λ”°λ‘œ λ‹€λ₯Έ 값을 가지지 μ•ŠμŠ΅λ‹ˆλ‹€.

    λ”°λ‘œ λ‹€λ₯Έ 값을 가진 λ‹€λŠ” μ˜λ―ΈλŠ”, Cμ–Έμ–΄λ₯Ό 예둜 λ“€λ©΄ Cμ–Έμ–΄μ—μ„œλŠ” 첫 번째 case λ₯Ό κ·Έ 자체 외에 0μ΄λΌλŠ” κ°’μœΌλ‘œ λŒ€μ²΄ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

     

    λ‹€λ₯Έ 값을 κ°€μ§€κ²Œ ν•˜λ €λ©΄ μ•„λž˜μ—μ„œ μ„€λͺ…ν•˜λŠ” Associated Value λ‚˜ Raw Value λ₯Ό μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

    // λ³€μˆ˜ ν˜Ήμ€ μƒμˆ˜κ°€ νƒ€μž…μ„ 이미 μ•„λŠ” κ²½μš°μ—λŠ” μ—΄κ±°ν˜• 이름을 μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    
    whereToGo = .east
    
    var myWay: Direction = .west

    λ˜ν•œ λ³€μˆ˜λ‚˜ μƒμˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλ‹€λ©΄ μ—΄κ±°ν˜•μ˜ νƒ€μž…λͺ…을 μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


     

    Associated Value

    enum Barcode: Equatable {
        case upc(Int, Int, Int, Int)
        case qrCode(String)
    }
    
    var productBarcode = Barcode.upc(8, 85909, 51226, 3)
    
    productBarcode = .qrCode("ABCDE")

    "Additional information alongside case values" - Swift.org

     

    μ—°κ΄€ 값은 case κ°€ κ°€μ§€λŠ” 좔가적인 μ •λ³΄μž…λ‹ˆλ‹€.

     

    case 에 좔가적인 정보듀을 같이 μ €μž₯ν•˜κ³  싢은 κ²½μš°μ— μ„ μ–Έν•©λ‹ˆλ‹€.

     

    그리고 μ—°κ΄€ κ°’μ˜ 경우 caseκ°„ κ°’μ˜ λΉ„κ΅λŠ” Equatable ν”„λ‘œν† μ½œμ„ 채택해야 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    productBarcode = .upc(8, 85909, 51226, 3)
    
    var newProductBarcode = Barcode.upc(9, 34782, 13583, 1)

    그리고 같은 case라도 λ‹€λ₯Έ 값을 가지고 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

     

     μœ„μ˜ 두 λ³€μˆ˜ productBarcode 와 newProductBarcode λŠ” λ‘˜ λ‹€ Barcode μ—΄κ±°ν˜• νƒ€μž…μ˜ upc μΌ€μ΄μŠ€ μ΄μ§€λ§Œ, Associated Value κ°€ λ‹€λ₯΄λ―€λ‘œ λ‹€λ₯Έ 값이 λ©λ‹ˆλ‹€.

     

    μ—°κ΄€κ°’μ˜ 접근은 보톡 μ•„λž˜μ™€ 같이 switch μ—μ„œ 값을 λ°”μΈλ”©ν•˜μ—¬ μ ‘κ·Όν•©λ‹ˆλ‹€.

    enum myCase {
        case numbers(Int, Int)
    }
    
    var value = myCase.numbers(3, 1)
    
    switch value {
    
    case let .numbers(test1, test2): // λ³€μˆ˜ value 의 μ—°κ΄€κ°’ 3을 μƒμˆ˜ test1에 바인딩 ν•˜λŠ” μ½”λ“œ
    	...
    
    case .numbers(let test1, var test2): // test1 은 μƒμˆ˜λ‘œ λ°”μΈλ”©ν•˜κ³ , test2 λŠ” λ³€μˆ˜λ‘œ 바인딩 ν•˜λŠ” μ½”λ“œ
    	...
    
    case .nubmers(_, var test2): // 첫번째 연관값은 μ™€μΌλ“œμΉ΄λ“œ νŒ¨ν„΄μœΌλ‘œ 바인딩 μƒλž΅ν•˜μ˜€λ‹€.
    	...
    }

     

    Raw Value

    enum Number: Int { // ν—€λ“œ 뢀뢄에 μ„ μ–Έν•  RawValue 의 νƒ€μž…μ„ κΈ°μž¬ν•©λ‹ˆλ‹€.
    
        case one = 1
        case two = 2
        case three = 3
    }
    
    var myNumber = Number(rawValue: 1)
    
    // rawValue μ†μ„±μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯
    print( myNumber.rawValue )
    
    // λ‹€μŒμ˜ κ²°κ³ΌλŠ”?
    myNumber = Number(rawValue: 100)

    "Prepopulated value"

     

    Raw ValueλŠ” 미리 μ±„μ›Œμ Έ μžˆλŠ” κ°’μœΌλ‘œ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έ μ‹œμ— κ·Έ 값이 κ²°μ •λ©λ‹ˆλ‹€.

     

    μœ„ μ½”λ“œμ—μ„œ case one, two, three λŠ” 각각 1, 2,3 μ΄λΌλŠ” Raw Value λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

     

    case 의 Raw Value λŠ” .rawValue μ†μ„±μœΌλ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.

     

    그런데 직접 μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ RawValue κ°€ μžλ™μœΌλ‘œ μ±„μ›Œμ§€λŠ” 두 가지 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

     

    >>> Raw Value <<<  μ΄ 글을 μ°Έκ³ ν•΄μ£Όμ„Έμš”!!!😎


     

    Method 선언이 κ°€λŠ₯ν•˜λ‹€

    μ—΄κ±°ν˜•λ„ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ νƒ€μž… λ©”μ„œλ“œμ˜ 선언이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    enum Direction {
        case north, south, east, west
        func instance() {
            print("Instance Method")
        }
        static func type() {
            print("Type Method")
        }
    }
    
    Direction.north.instance() // "Instance Method"
    
    //  Direction.north.type() -> Compile Error
    
    Direction.type() // "Type Method"

     

    CaseIterable

    κ΄€λ ¨ 글을 λ”°λ‘œ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


     

    Recursive Enumeration

    'indirect' ν‚€μ›Œλ“œλ₯Ό μ•žμ— 뢙이면, μ—΄κ±°ν˜•μ„ κ°€μ§€λŠ” case λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    μžμ„Έν•œ λ‚΄μš©μ€ μ‚¬μš©ν•  κ²½μš°κ°€ μžˆμ„ λ•Œ λ‹€μ‹œ ν•œλ²ˆ μ •λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

     

     

     

    끝!


    πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

    iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜