반응형
Codable
- 자신을 특정표현으로 변환하거나 변환될 수 있는 타입
- 쉽게말해 특정표현으로 인코딩할 수 있고, 특정표현으로부터 디코딩될 수 있는 타입이라는 것이다.
typealias Codable = Decodable & Encodable
- 실제로
Codable
은 위와 같이Decodable
과Encodable
가 함께 존재하는 형태로 이루어져 있다. - 여기서 특정표현은 여러가지가 있을 수 있지만, 주로 다루게 되는 것은 JSON이다.
- Class, Enum, Struct에서 모두 사용이 가능하다.
Codable
프로토콜을 채택한 구조체로 Encoding, Decoding을 해보며 이해해보자.
Encoding
struct DataModel : Codable {
var title : String
var number : Int
}
- 위와 같이 Codable 프로토콜을 채택한
DataModel
구조체가 있다고 하자.
let data = DataModel(title: "one", number: 1)
let encoder = JSONEncoder()
let jsonData = try? encoder.encode(data)
if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
}
DataModel
구조체로 객체를 만들고 이를 인코딩하는 과정이다.- 최종 출력문은
{"title":"one","number":1}
가 될 것이다.
encoder.outputFormatting = .prettyPrinted // 간격이 보기좋게 정리되도록함
encoder.outputFormatting = .sortedKeys // 결과를 key값 순서로 정렬함
encoder.outputFormatting = \[.sortedKeys, .prettyPrinted] // 둘 모두 적용
- 위와 같이
encoder.outputFormatting
값을 조정해서 인코딩결과를 보기 좋게 만들 수도 있다.
Decoding
let decoder = JSONDecoder()
var data = jsonString.data(using: .utf8)
jsonString
은 아까 인코딩해서 만든 값이다.- 이를 다시
.utf8
로 data화한다. (jsonData)
if let data = data, let myData = try? decoder.decode(DataModel.self, from: data) {
print(myData.title)
print(myData.number)
}
- 디코딩을 할 땐 디코딩을 수행할 적절한 type을 넣어줘야한다. 물론 이는 Decodable 혹은 이를 포함한 Codable이어야 한다.
- 모든 과정을 수행하면 우리가 설정한
DataModel
구조체의 객체가 반환된다.
활용방안
- API에서 JSON Data를 받아오고 이 중 필요한 데이터를 모델로 정리한 Struct, Class, 혹은 Enum을 작성한다. (반드시 JSON에 존재하는 모든 데이터를 프로퍼티화할 필요는 없다. 필요한 것만 하면 필요한 것만 받아와진다.)
- 해당 모델을 기반으로 한 객체를 불러와 자유롭게 사용하면 된다.
- 따라서 아마 인코딩보단 디코딩할 일이 많을 것이다.
반응형
'🍎 Apple > Swift' 카테고리의 다른 글
[Swift] 문자열 처리 (0) | 2022.01.22 |
---|---|
[Swift] NSCache와 NSDictionary의 차이점 (0) | 2022.01.22 |
[Swift] UserDefaults와 Codable, NSCoding (2) | 2022.01.01 |
[Swift] Dynamic Dispatch 줄이기 (0) | 2021.12.16 |
[Swift] 기초 문법 정리 (0) | 2021.07.18 |