[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Swift

[Swift] Codable Protocol

inu 2021. 9. 2. 22:13
반응형

Codable

  • 자신을 특정표현으로 변환하거나 변환될 수 있는 타입
  • 쉽게말해 특정표현으로 인코딩할 수 있고, 특정표현으로부터 디코딩될 수 있는 타입이라는 것이다.
typealias Codable = Decodable & Encodable
  • 실제로 Codable은 위와 같이 DecodableEncodable가 함께 존재하는 형태로 이루어져 있다.
  • 여기서 특정표현은 여러가지가 있을 수 있지만, 주로 다루게 되는 것은 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에 존재하는 모든 데이터를 프로퍼티화할 필요는 없다. 필요한 것만 하면 필요한 것만 받아와진다.)
  • 해당 모델을 기반으로 한 객체를 불러와 자유롭게 사용하면 된다.
  • 따라서 아마 인코딩보단 디코딩할 일이 많을 것이다.

참고 : https://zeddios.tistory.com/373

반응형

'🍎 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