Codable은 Encodable과 Decodable을 합친것이다.
Encodable -> data를 Encoder에서 변환해주려는 프로토콜로 바꿔주는 것
Decodable -> data를 원하는 모델로 Decode 해주는 것
json을 예로 들면,
Encodable -> 모델을 json으로 인코드
Decodable -> json을 내가 원하는 모델로 디코드
Codable은 프로토콜이기 때문에 struct, enum, class 전부 채택 가능.
struct User {
enum CodingKeys: String, CodingKey {
case id
case name
case birth
case phoneNum = "phone_num"
}
let id: Int
let name: String
let birth: String
let phoneNum: String
}
extension User: Decodable {
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
birth = try container.decode(String.seslf, forKey: .birth)
phoneNum = try container.decode(String.self, forKey: .phoneNum)
}
}
Decodable을 채택하면 무조건 init을 생성해야 한다.
Decodable을 채택한 후
func decode() {
let jsonString = """
[
{
"id": 1,
"name": "shark1",
"birth: "1997-02-21",
"phone_num": "010-2222-3333"
},
{
"id":2,
"name": "shark2",
"birth": "2000-01-03",
"phone_num": "010-1234-5678"
}
]
"""
let jsonData = jsonString.data(using: .utf8(
do {
guard let jsonData = jsonData else { return }
let dataModel = try JSONDecoder().decode([USer].self, from: jsonData)
print(dataModel)
} catch let error {
print("에러: \(error)")
}
}
1) jsonString이라는 임의의 json 형태의 string 타입의 변수 생성
2) decode하기 위해 Data타입이 필요하기 때문에 String타입을 Data로 변환
3) JSONDecoder()를 이용하여 decode를 [USER] 타입에 맞게 변환
[Codable.User(id: 1, name: "shark1", birth: "1997-02-21", phoneNum: "010-2222-3333"), Codable.User(id: 2, name: "shark2", birth: "2000-01-03", phoneNum: "010-1234-5678")]
Encodable은 Decodable의 반대로 하면 된다.
extension User: Encodable {
func encode(to encoder: Encoder) throws{
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(name, forKey: .name)
try container.encode(birth, forKey: .birth)
try container.encode(phoneNum, forKey: .phoneNum)
}
}
func encode() {
let userObject = User(id: 1, name: "shark1", birth: "2000-03-02", phoneNum: "010-3434-2222")
do {
let jsonData = try JSONEncoder().encode(userObject)
let jsonString = String(data: jsonData, encoding: .utf8)
guard let printJsonString = jsonString else { return }
print(printJsonString)
} catch let error {
print("에러 뿜뿜 : \(error)")
}
}
{"id":1,"name":"shark1","birth":"2000-03-02","phone_num":"010-3434-2222"}