티스토리 뷰
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" 의 경우 프로퍼티 명을 그대로 사용하고 싶다면 케이스 입력을 생략해도 문제 없습니다~
'iOS' 카테고리의 다른 글
[iOS] 동시성, 비동기 프로그래밍 톺아보기 (0) | 2019.08.21 |
---|---|
[iOS] Photos 프레임워크 톺아보기 (2) | 2019.08.10 |
[iOS] 세궈(Segue) 톺아보기 (1) | 2019.08.01 |
[iOS] UITableView 톺아보기 - 3 (0) | 2019.08.01 |
[iOS] UITableView 톺아보기 - 2 (0) | 2019.08.01 |
댓글
공지사항