ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 5.6 Enumerations
    기술/iOS 2022. 3. 20. 17:44

    Enumerations

    Enumeration Syntax

    enum CompassPoint {
        case north
        case south
        case east
        case west
    }
    

    열거형 안에 정의된 값은 열거형 케이스 입니다. 새로운 열거형 케이스를 나타내기 위해 case 를 사용합니다.

    여러개의 케이스는 콤마로 구분하여 한 줄로 표기할 수 있습니다.

    각 열거형 정의는 새로운 타입으로 정의합니다. Swift 의 다른 타입처럼 대문자로 시작하는 그들의 이름이 ( CompassPoint ) 타입입니다. 열거형 타입에 복수 이름이 아닌 단수 이름으로 지정하여 읽기 쉽습니다.

    Matching Enumeration Values with Switch Statement

    switch 구문으로 각각의 열거형 값을 일치시킬수 있습니다.

    directionToHead = .south
    switch directionToHead {
    case .north:
        print("Lots of planets have a north")
    case .south:
        print("Watch out for penguins")
    case .east:
        print("Where the sun rises")
    case .west:
        print("Where the skies are blue")
    }
    // Prints "Watch out for penguins"
    

    Iterating over Enumeration Cases

    일부 열거형의 경우 열거형의 모든 케이스를 수집하는 것이 유용합니다. 열거형 이름 뒤에 : CCaseIterable 을 작성하여 활성화 합니다. Swift 는 열거형 타입에 allCases 프로퍼티로 모든 케이스를 수집하고 방출합니다.

    for beverage in Beverage.allCases {
        print(beverage)
    }
    // coffee
    // tea
    // juice
    

    Associated Values

    enum Barcode {
        case upc(Int, Int, Int, Int)
        case qrCode(String)
    }
    

    이 정의는 어떠한 실질적인 Int 또는 String 을 제공하지 않습니다. 이것은 단지 Barcode.upc 또는 Barcode.qrCode 와 같을 때 Barcode 상수와 변수에 저장할 수 있는 연관된 값의 타입을 정의할 뿐입니다.

    그러면 이러한 타입을 이용해서 새로운 바코드를 생성할 수 있습니다.

    var productBarcode = Barcode.upc(8, 85909, 51226, 3)
    
    switch productBarcode {
    case .upc(let numberSystem, let manufacturer, let product, let check):
        print("UPC: \\(numberSystem), \\(manufacturer), \\(product), \\(check).")
    case .qrCode(let productCode):
        print("QR code: \\(productCode).")
    }
    // Prints "QR code: ABCDEFGHIJKLMNOP."
    

    Raw Values

    연관된 값의 대안으로 열거형 케이스는 모두 동일한 타입의 기본값(원시값)으로 미리 채워질 수 있습니다.

    Implicitly Assigned Raw Values

    정수 또는 문자열 원시값이 저장된 열거형으로 동작 시 각 케이스에 명시적으로 원시값을 가질 필요가 없습니다. 원시값을 지정하지 않으면 Swift 는 자동으로 값을 할당합니다.

    예를 들어 정수를 원시값으로 사용하면 각 케이스의 암시적 값은 이전 케이스보다 하나씩 증가합니다.

    enum Planet: Int {
        case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
    }
    

    아래는 문자열 원시값으로 나타내는 버전입니다.

    enum CompassPoint: String {
        case north, south, east, west
    }
    

    rawValue 프로퍼티를 통해 열거형 케이스의 원시 값에 접근할 수 있습니다.

    let earthsOrder = Planet.earth.rawValue
    // earthsOrder is 3
    
    let sunsetDirection = CompassPoint.west.rawValue
    // sunsetDirection is "west"
    

    Initializing from a Raw Value

    원시 값 타입으로 열거형을 정의한다면 열거혀 원시값의 타입을 사용하는 초기화를 자동으로 수신하고 열거형 케이스 또는 nil 을 반환합니다.

    let possiblePlanet = Planet(rawValue: 7)
    // possiblePlanet is of type Planet? and equals Planet.uranus
    

    만약 rawValue 가 없는 값을 채택했더라면 nil 을 반환합니다. 때문에 여기서 Planet 반환타입은 Planet? 입니다.

    Recursive Enumerations

    재귀 열거형은 열거형 케이스에 하나 이상의 연관된 값으로 열거형 다른 인스턴스를 가지고 있는 열거형입니다. 열거형 케이스가 재귀적임을 나타내기위해 케이스 작성 전에 indirect 를 작성하여 컴파일러에게 필요한 간접 계층을 삽입하도록 지시합니다.

    '기술 > iOS' 카테고리의 다른 글

    Swift 5.6 Properties  (0) 2022.03.20
    Swift 5.6 Structures and Classes  (0) 2022.03.20
    Swift 5.6 Closures  (0) 2022.03.20
    Swift 5.6 Functions  (0) 2022.03.20
    Swift 5.6 Control Flow  (0) 2022.02.26

    댓글 0

Designed by Tistory.