본문 바로가기
Swift

CodingKey에 관하여

by iOS 개린이 2023. 3. 31.

CodingKey

-애플의 정의에 따르면

"A type that can be used as a key for encoding and decoding."

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

Codable, CodingKey 프로토콜을 채택하면 인코딩 및 디코딩 프로세스 중 사용되는 키 이름을 사용자 정의할 수 있다.

 

 

Post 구조체의 id가 바로 Key를 말하며 저 Key의 이름을 내 맘대로 커스텀해서 쓸 수 있다는 말씀이다.

 

우리 Swift에서는 변수나 상수의 이름을 소문자 카멜케이스를 사용해서 정의한다.

하지만 우리가 변환할 API 문서 형식(예 - JSON)은 다른 형태로 Key의 이름을 가지고 있을 때가 있다. 

이런 경우에 원칙대로 Key 이름을 정의하지 못하는 단점을 CodingKey를 통해 내 맘대로 이름을 바꿔주는 것이다.

 

 

CodingKey의 사용

서버에서 다음과 같이 JSON형식의 데이터를 보내준다고 하자.

{
    "id": 1,
    "first_name": "John",
    "last_name": "Doe",
    "hire_date": "2023-01-01T00:00:00Z"
}

 

JSON은 snake_case를 사용하기 때문에 Key 이름을 정의할 때 _ 를 사용하여 정의한다.

 

 

CodingKey를 사용하여 모델을 만들어보자.

 

"first_name" 과 같이 snake_case로 만들어진 Key의 이름은 맘에 들지 않기 때문에 

내 입맛대로 firstName으로 변경해준다.

이렇게 CodingKey 프로토콜을 사용하여 나열된 케이스에 원래 데이터의 Key 이름을 원시값으로 넣어주면 알아서 데이터가 변환된다.

  

 

내 맘대로 Custom한 모델을 사용해보자.

 

먼저 DateFormatter() 를 사용한 이유는 데이터 중 hireDate를 내가 보기 편한 방식으로 변경하기 위해서다.

다음 JSONDecoder() 를 생성해주고, date 형식을 Decoding 해줄 경우 어떤 포맷 형태를 사용할지 설정한다.

 

jsonString은 위에서 서버에서 내려주는 JSON형식의 데이터를 말하며, 이를 데이터 형식으로 변경해준 후, decode를 실시한다.

 

decode 메서드의 정의

 

제네릭함수로 어떤 타입이든 들어갈 수 있지만, Decodable을 채택한 타입이어야 한다. (Codable을 채택해주었기 때문에 만족함.)

또한 에러를 반환할 수 있는 함수이기 때문에 꼭 try를 사용해주어야 한다.(try! 하지말고 try? 하세요.)

 

 

이 부분을 좀 더 살펴보자.

decoder.dateDecodingStrategy = .formatted(dateFormatter)

 

Codable을 채택했을 때, JSON이 표준 Date 형식과 일치한다면 알아서 Date 타입으로 변환주지만 dateDecodingStrategy를 통해 JSON 객체의 Date를 디코딩할 때 어떤 전략을 사용할 지 정해주어야 한다.

 

dateDecodingStategy에는 .formatted 외에도 많은 전략들이 있으니 살펴보면 좋다.

 

 

 

 

 

Reference

-https://zeddios.tistory.com/394

'Swift' 카테고리의 다른 글

Swift Concurrency  (1) 2024.09.22
메모리 안전에 관하여  (0) 2023.03.17
Error Handling(에러 처리)에 관하여  (0) 2023.03.16
Where절에 관하여  (0) 2023.03.15
패턴에 관하여  (0) 2023.03.15