적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

enum case 예외 처리 (default 값 설정)

hongssup_ 2023. 7. 4. 20:45
반응형

최근 후기 뜨지 않는 문제. enum 디코딩 에러. enum case 예외 처리

개발 서버에서 테스트 중에 최근 후기가 뜨지 않는 문제가 발생했다. 

ERROR : dataCorrupted(Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "reviews", intValue: nil), _JSONKey(stringValue: "Index 7", intValue: 7), CodingKeys(stringValue: "product_type", intValue: nil)], debugDescription: "Cannot initialize SaleProductType from invalid Int value 15", underlyingError: nil))

확인해보니 enum 으로 정의된 product type 외에 다른 값이 들어와서 디코딩이 되지 않아 발생하는 문제였다. 

 

struct Review: Codable {
    let productType: ProductType?
    ...
}

enum ProductType: Int, Codable {
    case text = 1
    case voice = 2
    case video = 3
}

 

엥 타입 내에 정의되어있지 않은 값이면 서버에서 아예 안보내줘야 하는 것이 아닌가? 생각했는데

서버 측에서는 그럼 타입이 새로 추가되면 업데이트 하지 않은 기존 유저들에게는 오류가 뜨는 것 아니냐.

없는 타입이 들어오더라도 에러가 나지 않도록 default 값을 처리해주라고 하셨는데 그것도 맞는 말 같고.. 

안드로이드 쪽에서는 일단 데이터는 불러온 후에 후처리로 enum 으로 타입을 나눠주고 있어서 정의되지 않은 타입이 들어와도 

 

다음과 같이 default case 를 추가해준 후, init() 을 통해 default 값으로 초기화를 시켜주면
정의되지 않은 타입이 들어와도 디코딩 에러가 나지 않고 default로 처리를 해줄 수 있다. 

struct Review: Codable {
    let productType: ProductType?
    ...
}

enum SaleProductType: Int, Codable {
    case text = 1
    case voice = 2
    case video = 3
    case `default` = 999
    
    init() {
        self = .default
    }
}

 

 

 

참고 : 

https://stackoverflow.com/questions/37731962/default-value-for-enum-in-swift

 

Default value for Enum in Swift

I have an enum : public enum PersonType:String { case Cool = "cool" case Nice = "rude" case SoLazy = "so-lazy" public var

stackoverflow.com

 

728x90
반응형