[IOS - Swift] Codable

서프로·2023년 5월 8일
0

Codable

Codable은 swift4 버전에서 처음 소개된 것으로 공식 홈페이지의 정의는 이렇다.

A type that can convert itself into and out of an external representation.

번역하면.. 자신을 외부표현으로 변환하거나 외부표현을 변환할 수 있는 형식..?
뭐 번역하면 이렇고 Codable은 쉽게말해 Encodable과 Decodable이 합쳐진 것이다.

여기서 EncodableDecodable이 뭐냐!?
json을 예시로 들자면
Encodable -> Model data를 json으로 인코드
Decodable -> json을 Model data로 디코드
이렇게 보면 이해가 쉬울 것 같습니다.

그래서 그거 어떻게 사용하는데 ?
바로 예제코드로 살펴보겠습니다!

struct Person: Codable {
    var name: String
    var age: Int
    var email: String?
}

위와 같이 Person이라는 구조체가 있다고 가정했을 때, 인코딩 하는 코드는 아래와 같습니다.

// 인코딩
let person = Person(name: "John Doe", age: 30, email: "johndoe@example.com")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted

do {
    let jsonData = try encoder.encode(person)
    if let jsonString = String(data: jsonData, encoding: .utf8) {
        print(jsonString)
//        {
//            "name" : "John Doe",
//            "age" : 30,
//            "email" : "johndoe@example.com"
//        }
    }
} catch {
    print("인코딩 에러: \(error)")
}

먼저 person이라는 객체를 만들고 JSONEncoder를 사용하여 Data타입으로 만들어줍니다.
그후 String으로 변환 해주면 된다. 엄청 간단하다.

계속해서 디코딩하는 코드도 예제로 살펴보겠습니다.

// 디코딩
let jsonString = """
{
    "name": "Jane Smith",
    "age": 25
}
"""

let decoder = JSONDecoder()
if let jsonData = jsonString.data(using: .utf8) {
    do {
        let decodedPerson = try decoder.decode(Person.self, from: jsonData)
        print(decodedPerson)
    } catch {
        print("디코딩 에러: \(error)")
    }
}

위와같이 작성하면 이렇게 Person 타입으로 변환되어 나온다.
Person(name: "Jane Smith", age: 25, email: nil)
디코딩은 인코더와 반대로 JSONDecodar를 사용하여 String타입으로 되어있는 json데이터를 Person에 맞추어 변환 해주게 된다.

이처럼 Codable 프로토콜을 사용하면 인코딩 및 디코딩 과정을 간단하게 처리할 수 있습니다.

0개의 댓글