Codable은 swift4 버전에서 처음 소개된 것으로 공식 홈페이지의 정의는 이렇다.
A type that can convert itself into and out of an external representation.
번역하면.. 자신을 외부표현으로 변환하거나 외부표현을 변환할 수 있는 형식..?
뭐 번역하면 이렇고 Codable은 쉽게말해 Encodable과 Decodable이 합쳐진 것이다.
여기서 Encodable과 Decodable이 뭐냐!?
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 프로토콜을 사용하면 인코딩 및 디코딩 과정을 간단하게 처리할 수 있습니다.