[Swift] Codable

Martin Kim·2021년 8월 29일
0

Swift

목록 보기
4/11
post-thumbnail

JSON

  • 앱은 서버와 통신을 할때 보통 json 형식으로 데이터를 주고 받는다.
  • 다음과 같이 영화에 관련된 json 덩어리가 있다고 합시다.
{
    "title": "신과함께-죄와벌",
    "reservation_grade": 1,
    "thumb": "http://movie.phinf.naver.net/20171201_181/1512109983114kcQVl_JPEG/movie_image.jpg?type=m99_141_2",
    "id": "5a54c286e8a71d136fb5378e",
    "reservation_rate": 35.5,
    "user_rating": 7.98,
    "grade": 12,
    "date": "2017-12-20"
},
  • 보통 위와 같은 형태인데 흔히 파이썬이나 딕셔너리와 유사한 Key-Value 의 구조를 갖는다.

Codable

  • 스위프트에서는 데이터를 인코딩, 디코딩 할 수 있는 프로토콜을 Codable로 정의했다.
  • Codable 타입의 프로퍼티는 모두 다 Codable 프로토콜을 준수해야만 하는데 스위프트 기본 타입 대부분은 Codable을 준수한다.
  • 예를 들어 위와 같은 json을 파싱하려면 다음과 같은 Codable 구조체를 선언한다.
struct Movie: Codable {
    var title: String
    var reservationGrade: Int
    var thumbnail: URL
    var id: String
    var reservationRate: Float
    var userRating: Float
    var grade: Int
    var date: Int
}
  • 그.런.데 한가지 문제가 있다. reservationGrade, thumbnail, reservationRate, userRating의 경우 실제 json의 키 명과 일치하지 않는데 이러면 스위프트는 어떤 프로퍼티를 가리키는지 모를 것이다.
  • 그래서 만약 json의 키와 Codable 구조체의 프로퍼티가 다르게 해주고 싶은 경우에는, Codable 구조체 안에 CodingKeys라는 이름으로 열거형 프로퍼티를 추가해야만! 한다.
struct Movie: Codable {
    var title: String
    var reservationGrade: Int
    var thumbnail: URL
    var id: String
    var reservationRate: Float
    var userRating: Float
    var grade: Int
    var date: Int
    
    enum CodingKeys: String, CodingKey {
        case title
        case reservationGrade = "reservation_grade"
        case thumbnail = "thumb"
        case id
        case reservationRate = "reservation_rate"
        case userRating = "user_rating"
        case grade
        case date
    }
}
  • 단 CodingKeys 열거형 케이스들의 이름은 실제 json의 키와 일치해야한다
  • 그런데 애초에 일치하도록 Codable 구조체에 선언했었다면, 값을 또 할당하지 않아도 된다.

    출처: 네이버 부스트코스 iOS 프로그래밍

profile
학생입니다

0개의 댓글