[iOS]_Codable

윤여송·2023년 11월 28일
0

iOS

목록 보기
11/11
post-thumbnail

Codable

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
}

Decodable

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"}
profile
y_some__velog

0개의 댓글