최근 후기 뜨지 않는 문제. 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
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift iOS] 화면 스와이프 swipe to pop / swipe back (+ RxGesture) (0) | 2023.07.17 |
---|---|
[Swift iOS] Lottie Animation 적용하기 (+ multiple animation) (0) | 2023.07.13 |
[Swift] Why double is preferred over float? (+ Int / Int32 / Int64) (0) | 2023.04.13 |
Swift 언어에 대하여 (0) | 2023.04.13 |
[Swift Concurrency] async / await (0) | 2023.03.06 |