티스토리 뷰

iOS

[iOS] Codable 톺아보기

국산 앨런 2019. 8. 1. 22:05

Codable

인스턴스를 다른 데이터 형태로 변환하고 그 반대의 역할을 수행하는 방법을 제공합니다.
스위프트의 인스턴스를 다른 데이터 형태로 변환할 수 있는 기능을 Encodable 프로토콜로 표현하였고, 그 반대의 역할을 할 수 있는 기능을 Decodable로 표현해 두었습니다. 그 둘을 합한 타입을 Codable로 정의해 두었습니다.

 

.. 왔?

 

 

 

일단 안을 들여다 보면 두 프로토콜 Decodable, Encodable 을 동시 채택하는 프로토콜... 입니다.

 

일단 Encoding, Decoding 용어에 대해서 먼저 살펴보겠습니다.

불라불라를 스위프트 타입의 인스턴스로 변환해 주는 것이 Decoding, 그 반대가 Encoding 입니다.

 

일단 예제를 통해 확인해 보지요

 

struct Student: Codable{
    let name: String
    let grade: Int
}

struct School: Codable{
    let location: String
    let name: String
    var students: [Student]
}

 

이런 식으로 Codable을 채택시키면 Student와 School은 인코딩, 디코딩이 되는 겁니다 !

 

...응?

 

그래서 어디 쓰인다고 ..?

 

가장 많은 사용예가 Json data를 디코딩 하는 경우일 텐데요

 

let json = """
            {
                "location": "Seoul",
                "name": "BestMiddle",
                "students": [
                    {
                        "name": "BestElon",
                        "grade": 10
                    },
                    {
                        "name": "PoorHanjoo",
                        "grade": 2
                    }
                ]
            }
            """.data(using: .utf8)!

 

이런 형태의 json data가 있습니다.

 

요거 어떻게 가져다 쓰실래요? ㅎㅂㅎ

 

Codable이 해줄거에요.

 

let decoder = JSONDecoder()
        
do {
	let school = try decoder.decode(School.self, from: json)
	
	print("\(school.name) School is located in \(school.location) and has")
	
	for student in school.students {
		print("\(student.name) who's grade is \(student.grade)")
	}
    
} catch {
	print(error)
}


//BestMiddle School is located in Seoul and has
//BestElon who's grade is 10
//PoorHanjoo who's grade is 2

 

Wow.....

 

그냥 되게 편하네요..

 

여기서 json의 프로퍼티가 좀 끔찍할 때도 Codable이 힘을 발휘합니다.

 

let json = """
            {
                "location_of_school": "Seoul",
                "name": "BestMiddle",
                "not_teacher_just.._young_..that...people..": [
                    {
                        "name": "BestElon",
                        "grade": 10
                    },
                    {
                        "name": "PoorHanjoo",
                        "grade": 2
                    }
                ]
            }
            """.data(using: .utf8)!

 

무무물론 이렇게 설계되어 있을리가 없지만 Swift에서 변수에 언더바라니 있을 수가 없자나요 ??

 

struct School: Codable{
    let location: String
    let name: String
    var students: [Student]
    
    //CodingKey
    enum CodingKeys: String, CodingKey{
        case location = "location_of_school"
        case name
        case students = "not_teacher_just.._young_..that...people.."
    }
}

 

CodingKey 라는 애 덕분에 이렇게 우리는 우리의 갈길을, 원하는 프로퍼티로 디코딩을 할 수 있습니다

 

일종의 매핑을 해준다고 생각해도 될 것 같네요

 

"name" 의 경우 프로퍼티 명을 그대로 사용하고 싶다면 케이스 입력을 생략해도 문제 없습니다~

 

 

 

참고 : https://www.edwith.org/boostcourse-ios/lecture/20146/

댓글
공지사항