카테고리 없음

Swift) 열거형

나태한개발 2024. 6. 14. 22:09

열거형 정의

열거형은 enum 키워드를 사용하여 정의한다. 각 케이스는 열거형의 가능한 값을 나타낸다.

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

열거형 CompassPoint는 네 개의 방향을 나타내는 값을 가진다.

 

열거형 사용

열거형 값을 변수나 상수에 할당하고 사용할 수 있다.

var direction = CompassPoint.north

// 열거형 값 변경
direction = .east

스위프트는 타입 추론을 통해 열거형 타입을 알 수 있기 때문에, 열거형 타입이 명확한 경우에는 .east처럼 간단히 작성할 수 있다.

 

열거형과 스위치 문

열거형 값에 따라 다른 동작을 수행하려면 스위치(switch) 문을 사용할 수 있다.

switch direction {
case .north:
    print("북쪽")
case .south:
    print("남쪽")
case .east:
    print("동쪽")
case .west:
    print("서쪽")
}

스위치 문에서 열거형의 모든 케이스를 반드시 처리해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.

 

연관 값(Associated Values)

열거형의 각 케이스에 연관 값을 추가할 수 있다. 이를 통해 케이스마다 다른 타입의 값을 가질 수 있다.

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

var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

 

연관 값을 가진 열거형을 사용할 때는 스위치 문을 사용하여 값을 추출할 수 있다.

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let code):
    print("QR Code: \(code)")
}

원시 값(Raw Values)

열거형 케이스에 정수, 문자열 등의 원시 값을 할당할 수 있다. 이를 통해 열거형 케이스를 더 간결하게 표현할 수 있다.

enum Planet: Int {
    case mercury = 1
    case venus
    case earth
    case mars
}

let earthOrder = Planet.earth.rawValue // 출력: 3

if let somePlanet = Planet(rawValue: 2) {
    print(somePlanet) // 출력: venus
}

 

열거형 메서드

열거형에 메서드를 정의하여 관련 기능을 추가할 수 있다.

enum CompassPoint {
    case north
    case south
    case east
    case west

    func description() -> String {
        switch self {
        case .north:
            return "북쪽"
        case .south:
            return "남쪽"
        case .east:
            return "동쪽"
        case .west:
            return "서쪽"
        }
    }
}

let direction = CompassPoint.east
print(direction.description()) // 출력: 동쪽

 

열거형의 활용

열거형은 코드의 가독성을 높이고, 타입 안전성을 유지하며, 특정 값의 집합을 정의할 때 유용하다. 예를 들어, 네트워크 요청의 결과를 열거형으로 표현할 수 있다.

enum NetworkResult {
    case success(Data)
    case failure(Error)
}

func handleNetworkResult(_ result: NetworkResult) {
    switch result {
    case .success(let data):
        print("성공: \(data)")
    case .failure(let error):
        print("실패: \(error)")
    }
}