Enum String Representations: CustomStringConvertible와 String Raw 값 타입을 활용한 Swift 열거형(Enum) 비교

Doyeong Kim·2023년 8월 11일
0

Swift

목록 보기
7/9

enum을 사용하면서 CaseIterable, CustomStringConvertible 등의 프로토콜을 채택하는 경우가 종종 있었는데 CustomStringConvertible을 채택해서 사용하는거랑 그냥 String을 채택해서 rawValue로 사용하는거랑 비슷하지 않나? 크게 뭐가 다른가 궁금해서 개념을 확인하게 되었다.

1. CustomStringConvertible 프로토콜

'CustomStringConvertible' 프로토콜을 채택함으로써 enum의 각 case에 대해 사용자 정의 문자열 표현을 정의할 수 있다. 이 프로토콜을 채택함으로써, 요구에 맞게 더 자세하고 읽기 쉬운 문자열 표현을 제공할 수 있다!

  • 애플 공식 예시:
enum Direction: CustomStringConvertible {
    case north, south, east, west

    var description: String {
        switch self {
        case .north: return "북쪽"
        case .south: return "남쪽"
        case .east: return "동쪽"
        case .west: return "서쪽"
        }
    }
}

let east = Direction.east
print("east: ", east) // 동쪽

위와 같은 구현을 통해 'print(direction)' 또는 'String(describing: direction)' 를 호출하면 각 case에 대해 정의한 사용자 정의 문자열 표현이 반환된다.

추가 예제:

CustomStringConvertible 은 enum 문자열 표현에 추가 정보를 포함할때 유용하다. 그래서 특정 사용 사례에 맞는 더 구체적인 출력을 만들 수 있다.

enum VehicleType: CustomStringConvertible {
    case car(name: String, year: Int)
    case bike(name: String, year: Int)
    case truck(name: String, year: Int)

    var description: String {
        switch self {
        case .car(let name, let year):
            return "자동차 - 이름: \(name), 제조 연도: \(year)"
        case .bike(let name, let year):
            return "오토바이 - 이름: \(name), 제조 연도: \(year)"
        case .truck(let name, let year):
            return "트럭 - 이름: \(name), 제조 연도: \(year)"
        }
    }
}

let vehicles: [VehicleType] = [
    .car(name: "Toyota Camry", year: 2022),
    .bike(name: "Harley Davidson", year: 2020),
    .truck(name: "Ford F-150", year: 2021)
]

for vehicle in vehicles {
    print(vehicle)
}

// Outputs:
// 자동차 - 이름: Toyota Camry, 제조 연도: 2022
// 오토바이 - 이름: Harley Davidson, 제조 연도: 2020
// 트럭 - 이름: Ford F-150, 제조 연도: 2021

2. String Raw 값 타입

enum의 case에는 raw value를 할당할 수 있고, 이때 String, Int 등의 hashable 타입을 raw value 타입으로 사용할 수 있다. 'String' 형태의 raw value를 사용하면 각 enum case는 해당 case의 raw value를 기반으로 하는 기본 문자열 표현과 연관된다.

  • 예시:
enum Direction: String {
    case north = "N"
    case south = "S"
    case east = "E"
    case west = "W"
}

let east = Direction.east.rawValue
print("east: ", east)
// east:  E

이 방식을 사용하면 enum case의 raw string 값을 가져오는 것은 'direction.rawValue' 를 사용하는 것만으로 간단하다.


* 적절한 방식 선택

둘 다 enum 값이 문자열로 어떻게 표현되는지를 사용자 정의하는 데 유용한 도구이다. 요구 사항에 따라 앱의 필요에 가장 적합한 접근 방식을 선택하면 될 것 같다.

  • enum case의 문자열 표현에 미세한 제어가 필요한 경우 'CustomStringConvertible' 를 사용.

🤔 추가 정보를 활용해 더 구체적인 출력이 필요할때 가독성있게 만들어 줄 수 있을 것 같다.

  • enum case의 raw 값이 이미 원하는 문자열 표현과 일치하는 경우, 'String' rawValue 타입을 선택.

🤔 문자열로 쉽게 변환 가능하고 enum과 해당 string 간 간단한 매핑이 필요한 경우엔 이 접근 방식이 편리한 선택인 것 같다.


References:
https://developer.apple.com/documentation/swift/customstringconvertible

profile
신비로운 iOS 세계로 당신을 초대합니다.

0개의 댓글