Swift의 Codable - Coding key / Decoding Container

Jee.e (황지희)·2022년 4월 6일
0
post-custom-banner

앱은 API를 통해 서버의 데이터를 가져와 사용한다.
데이터는 주로 JSON 파일로 이루어져있는데, Swift에서 사용하기 위해선 데이터 파싱(Decodable & Encodable)을 해야한다.

Swift4 부터는 한 줄로 데이터 파싱이 가능해졌는데, 이때 사용되는게 Codable 이다.




Codable

  • 공식 문서를 보면, CodableDecodable & 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)
}



CodingKey

  • 인코딩 및 디코딩을 위한 Key로 사용할 수 있는 프로토콜이다.
  • 인코딩 및 디코딩을 하기 위해선, JSON의 Key와 사용자가 정의한 Key(프로퍼티)가 일치해야한다.
    만약 이름을 다르게 변경하고 싶을 때, 타입 내부에 CodingKeys 라는 열거형 CodingKey 를 채택해 선언해주면 된다.
struct confirmedCase: Codable {
    let date: String
    let numbers: Int
    
    enum CodingKeys: String, CodingKey {
        case date
        case numbers = "numberOfConfirmedCase"
    }
}



Decoding Container

  • 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

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.
post-custom-banner

0개의 댓글