새소식

인기 검색어

iOS/iOS

[iOS] Codable CodingKey

  • -

Codable

Codable프로토콜은 Encodable과 Decodable이 합쳐진것이다.

 

Encodable은 모델을 bytes 형식의 데이터로 변환하는것이고

Decodable은 반대로 bytes 형식의 데이터를 모델로 변환하는것이다

 

ex) 

data -> Json (Decode)

Json -> Data (Encode)

 

Codable을 채택했을때 아래와 같은 오류가 뜨는 경우가 있는데

Type 'Object' does not conform to protocol 'Decodable'

Type 'Result' does not conform to protocol 'Encodable'

이는 Codable을 채택한 오브젝트내의 저장속성이 Codable을 채택한 타입이 아니라서 오브젝트가 자동으로 Codable을 채택한것이 아니라서 직접 Decodable과 Encodable을 구현해주어야 한다.

 

자동으로 Codable 프로토콜 준수

Codable을 채택한 Class 또는 Struct의 저장속성이 전부 Codable을 채택한 타입으로 선언하면 따로 Decodable과 Encodable을 정의해주지 않아도 자동으로 Codable 프로토콜을 따르게 된다 Codable을 지원하는 타입은 Int, Double, String, Data, Date, Url등과 같이 Foundation 타입이다

 

UIImage와 같이 UIKit의 타입들은 Codable을 채택하고 있지 않기 때문에 오류가 발생한다

 

 

CodingKey

Swift에선 카멜 표기법을 사용한다. 하지만 Json데이터를 보면 스네이크 표기법을 사용하는 경우가 많다

예를 들어 보자

 

let json = """
{

"first_name" = "junbok",

"last_name" = "lee

"age" = 99


}
"""

 

codable을 채택한 모델에 Json을 파싱하려면 키값과 벨류타입이 일치해야 디코딩이 성공하기 때문에 위의 json을 토대로 모델을 작성해보면 아래와 같아진다

struct Person: Codable {
    let first_name: String
    let last_name: String
    let age: Int
}

 

하지만 앞서말한것 같이 swift는 카멜 표기법을 따른다. 하지만 입력받은 json데이터는 스네이크 표기법을 따른다. 

모델의 키값을 내 마음대로 카멜표기법으로 바꾼다면 json을 디코딩해봤자 키값이 일치하지 않기때문에 오류가 발생할 것이다

// decode 오류발생
struct Person: Codable {
    let firstName: String
    let lastName: String
    let age: Int
}

 

그럼 Person데이터를 사용할때마다 스네이크 표기법을 계속 사용해야하는가 ?? 이때 등장하는 것이 CondingKey이다.

인코딩 및 디코딩 키로 사용할 수 있는 타입

그럼 CondingKey는 어떻게 사용하는지 알아보자

 

let json = """
{

"first_name" = "junbok",

"last_name" = "lee

"age" = 99


}
"""

struct Person: Codable {
    let firstName: String
    let lastName: String
    let age: Int
    
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
        case age
    }
}

 

먼저 json의 키값이 String이기 때문에 원시값의 타입을 String으로 지정해주고

json에 key값이 각각 "first_name", "last_name", "age" 이렇게 3개가 있지만

우리는 swift 내부에서 각각 "firstName", "lastName", "age" 로 바꿔줄 것이기 때문에 이에 맞춰 case를 추가해주고 

키값을 바꾸고싶은 firstName과 lastName의 원시값에 기존 json의 key값인 first_name과 last_name을 넣어주면 된다.

 

 

CodingKey 채택시 주의사항

기본적인 사항인데 열거형으로 선언한 값과 클래스/구조체에 선언한 저장속성과 일치하지 않으면 에러가 발생한다

물론 개수도 다 맞아야한다 많거나 적어도 에러가 발생한다.

저장속성은 int이지만 CodingKeys는 Int이기 때문에 에러발생
개수가 적어도 에러가 발생
많아도 에러가 발생한다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.