앱은 API를 통해 서버의 데이터를 가져와 사용한다.
데이터는 주로 JSON 파일로 이루어져있는데, Swift에서 사용하기 위해선 데이터 파싱(Decodable & Encodable)을 해야한다.
Swift4 부터는 한 줄로 데이터 파싱이 가능해졌는데, 이때 사용되는게 Codable
이다.
- 공식 문서를 보면,
Codable
은Decodable & Encodable
로 이루어져있다.
즉, 디코딩과 인코딩이 가능한 프로토콜이다.Class
,Struct
,Enum
에 채택해 사용한다.
typealias Codable = Decodable & Encodable
✅ 사용 예시
struct confirmedCase: Codable {
let date: String
let numberOfConfirmedCase: Int
}
// JSONEncoder 로 인코딩
let data = confirmedCase(date: "20220406 코로나 확진자", numberOfConfirmedCase: 286294)
do {
let encoder = JSONEncoder()
let data = try encoder.encode(data)
} catch {
print(error.localizedDescription)
}
- 인코딩 및 디코딩을 위한 Key로 사용할 수 있는 프로토콜이다.
- 인코딩 및 디코딩을 하기 위해선, JSON의 Key와 사용자가 정의한 Key(프로퍼티)가 일치해야한다.
만약 이름을 다르게 변경하고 싶을 때, 타입 내부에CodingKeys
라는 열거형CodingKey
를 채택해 선언해주면 된다.
struct confirmedCase: Codable {
let date: String
let numbers: Int
enum CodingKeys: String, CodingKey {
case date
case numbers = "numberOfConfirmedCase"
}
}
- API 응답 데이터 구조를 바꾸고 싶은 목적으로 Decodable / Encodable 프로토콜을 커스텀할 때 사용
struct ConfirmedCase {
let date: String
let numbers: Int
enum CodingKeys: String, CodingKey {
case date
case numbers = "numberOfConfirmedCase"
}
}
extension ConfirmedCase: Decodable {
init(from decoder: Decoder) throws {
// CodingKeys의 키를 사용하는 컨테이너 추출
let container = try decoder.container(keyedBy: CodingKeys.self)
self.date = try container.decode(String.self, forKey: .date)
self.numbers = try container.decode(Int.self, forKey: .numbers)
}
}
참고 문서
1. https://medium.com/humanscape-tech/swift%EC%97%90%EC%84%9C-codable-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-367587c5a591
2. https://etst.tistory.com/109