Codable이란 Encodable, Decodable 프로토콜로 이루어져 있고
Codable을 채택하면 Encodable, Decodable을 동시에 채택하는 것과 같습니다.
Encodable: 자신을 외부표현으로 인코딩 할 수 있는 타입
Decodable: 자신을 외부표현으로 부터 디코딩 할 수 있는 타입
먼저 Encodable
struct Person: Codable {
var name: String?
var age: Int?
}
var kim = Person(name: "Kim", age: 40)
//Encoding
if let encodeData = try? JSONEncoder().encode(kim) {
let jsonData = String(bytes: encodeData, encoding: .utf8)
print(jsonData) // {"name": "Kim", "age: 40}
}
Decodable
struct Person: Codable {
var name: String?
var age: Int?
}
var kim = Person(name: "Kim", age: 40)
if let encodeData = try? JSONEncoder().encode(kim) {
if let decode = try? JSONDecoder().decode(Person.self, from: encodeData) {
print(decode) // Person(name: Optional("Kim), age: Optional(40))
}
}
여기서 애플의 공식문서를 보게되면 Codable은 다른 Codable 이나 Array, Optional, Dictionary타입처럼 기본 제공 타입들을 사용할 수 있습니다.
struct Coordinate: Codable {
var latitude: Double
var longitude: Double
}
struct Landmark: Codable {
var name: String
var foundingYear: Int
var location: Coordinate
// Landmark is still codable after adding these properties.
var vantagePoints: [Coordinate]
var metadata: [String: String]
var website: URL?
}
CodingKey
Codable은 데이터를 디코딩 인코딩할 때 데이터의 이름이 일치하지 않는경우가 발생할때 CodingKey프로토콜을 이용해 해결할 수 있습니다.
struct Landmark: Codable {
var name: String
var foundingYear: Int
}
let landmark: [String: Any] = ["title": "landmarkA", "founding_date": 1900]
if let jsonData = try? JSONSerialization.data(withJSONObject: landmark, options: []) {
let decode = try! JSONDecoder().decode(Landmark.self, from: jsonData) // 에러
}
이렇게 키값이 맞지 않으면 에러를 발생시킵니다.
Landmark는 name과 foundingYear 두가지 키가 있지만 디코딩할 데이터는 title과 founding_date라는 키 값을 가지고 있기 때문에 에러가 발생합니다.
이럴 경우 CodingKey를 이용해서 키 값을 맞춰줄 수 있습니다.
struct Landmark: Codable {
var name: String
var foundingYear: Int
enum CodingKeys: String, CodingKey {
case name = "title"
case foundingYear = "founding_date"
}
}
'Swift' 카테고리의 다른 글
테이블뷰 당겨서 새로고침 만들기 (0) | 2020.10.16 |
---|---|
Alamofire - SessinoManager (0) | 2020.09.28 |
App Clips (0) | 2020.09.18 |
Cocoapods 오류 (0) | 2020.09.14 |
Swift - Navigation item 왼쪽 타이틀 주기 (0) | 2020.09.14 |