[Swift] Decodable 프로토콜

Updated:

Decodable 프로토콜

  • 우선 공식 문서의 정의를 보면 “A type that can decode itself from an external representation.” 라고 나와 있다.

  • 즉, 외부의 데이터 표현식을 내부에 정의된 모델에 맞게 매핑 시켜서 가져오게 해주는 프로토콜이다.

  • json 으로 예를 들면, json 데이터를 내부에 정의된 struct 나 class 인스턴스에 알맞게 매핑시켜 주는 거라 할 수 있겠다.



예시)

import UIKit

struct User {
    let number: Int
    
    let userName: String

    let fullName: String

    enum CodingKeys: String, CodingKey { // 각 프로퍼티 명과 일치
        case number

        case userName

        case fullName
    }
}

extension User: Decodable {
    init(from decoder: Decoder) throws {
        // 각 키(enum)에 맞게 매핑
        let container = try decoder.container(keyedBy: CodingKeys.self)
        number = try container.decode(Int.self, forKey: .number)
        userName = try container.decode(String.self, forKey: .userName)
        fullName = try container.decode(String.self, forKey: .fullName)
    }
}

let jsonString = """
                {
                    "number": 1,
                    "userName": "batman",
                    "fullName": "Bruce Wane"
                }
                """

    let jsonData = jsonString.data(using: .utf8)

    do {
        let jsonData = jsonData
        
        // 매핑 (User struct의 init 호출됨)
        let dataModel = try JSONDecoder().decode(User.self, from: jsonData!)

        print(dataModel) // User(number: 1, userName: "batman", fullName: "Bruce Wane") 출력
    } catch let error {
        print("DEBUG: \(error.localizedDescription)")
  }



예시) 파이어베이스 연동시

import FireBase
import FirebaseFirestoreSwift

guard let uid = Auth.auth().currentUser?.uid else { return } // 현재 로그인 유저의 id를 가져오기

COLLECTION_USERS.document(uid).getDocument { snapshot, _ in // 현재 유저 id를 가지는 필드들 가져오기
  // 필드의 json 데이터를 User 클래스로 매핑하기
  guard let user = try? snapshot?.data(as: User.self) else { return }
}

Categories:

Updated:

Leave a comment