ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Decoding Error
    🍎iOS 2022. 11. 2. 10:32

     

    Codable을 사용하다보면 decoding 관련 에러들을 많이 만나게 됨!

    사실 decoding 관련 에러에 90프로이상은 휴먼 에러(개발자의 받아 오는 데이터에 대한 구조 파악 미스, 오타)임!

    그래서 decoding 에러를 읽고 해결하는 방법에 대해서 말씀드리려고 합니다😊

     

    제가 만난 오류는 위의 이미지와 같이 typeMismatch 오류인데 아마 decoding 에러를 보신다면 거의 대부분이 위와 같은 에러를 만나게 되실 듯 합니다

    그래서 아마 구글링을 많이 하실텐데 구글링을 해도 해당 내용에 대해서는 데이터마다 구조가 다 다르기 때문에 에러에 대한 상세한 해결 방법을 얻기는 어려울 것입니다

    그래서 자신의 디코딩 에러에 대해서 읽고 해결할 줄 알아야하는데 위에 에러를 한번 해석해보면

    💡 typeMismatch: 말 그대로 타입이 맞지 않음!
    💡 Swift.Dictionary<Swift.String, Any>: 데이터의 타입은 스위프트의 딕셔너리 타입으로 되어 있음
    💡 Swift.DecodingError.Context: 디코딩에러가 발생했고 그 내용에 대해 괄호 안에서 명시해줌

     

    💡 codingPath: [ ] : 실패한 디코드 호출 지점에 도달하기 위해 사용된 coding key의 path(경로)인데 위에서는 [ ] 라고 나와있음!
    저건 어떤 거냐면 데이터가 [ ] 형태로 되어 있는데 그 안으로 들어가는 것 조차 실패했다는 것임!
    그러므로 아래의 예시 코드와 같이 데이터를 받을 때 사용할 코더블 구조체를 배열 형태로 만들어주면 해결이 가능함!
    //Codable 구조체
    struct ListPhoto: Codable, Hashable {
        let urls: Urls
    }
    
    //만약 이런 식으로 ListPhoto라는 코더블 구조체로 디코딩 하면 배열 형태가 아니기 때문에
    //받아오는 데이터에 대해 아예 접근을 못하게 됨!
    URLSession.request(codable: ListPhoto.self, endpoint: APIService.requestPhoto())
    
    //그러므로 아예 디코딩해줄 ListPhoto 타입의 배열을 만들어서 사용하거나
    //아래와 같이 배열형태로 변경해준다면 codingPath에서 실패했던 지점인 [ ]이 생성되었기 때문에
    //decoding 에러를 해결할 수 있게 됨!
    URLSession.request(codable: [ListPhoto].self, endpoint: APIService.requestPhoto())​

     

    💡 debugDescription: 디버깅 목적의 설명으로 정확히 무엇을 잘못한건지 설명해줌!
    💡 underlyingError: 근본적인 에러로 대부분 nil인 경우가 많은데 데이터 자체가 손상되었을 경우 에러가 나타나는 경우가 있음!

     

    이렇게 decodingError가 났을 경우 해결하는 방법에 대해서 알아봤는데 인제 무지성 구글링보다는 디코딩 에러에 대한 내용들을 읽어보고 해결해볼 수 있을 것 같은데 도움이 되셨으면 좋겠습니다!

    혹시 잘못된 내용이 있다면 언제든지 피드백 주시면 너무 감사합니다!!!😊

     

Designed by Tistory.