본문 바로가기

iOS

[iOS] Codable

Codable


cf)Codable

Codable 이란?


Codable: A type that can convert itself into and out of an external representation.

Codable 이라는 Typealias는 자신을 변환하거나 외부 표현으로 변환할 수 있는 타입을 의미한다.

여기서 외부표현이란 JSON과 같은 타입을 의미한다.



선언

typealias Codable = Decodable & Encodable

Codable 은 위와 같이 이루어져 있다.

즉, Codable은 Decodable 과 Encodable 프로토콜을 준수하는 타입이다.



Decodable & Encodable


Decodable : 자신을 외부표현(External representation)에서 디코딩 할 수 있는 타입
Encodable : 자신을 외부표현(External representation)에서 인코딩 할 수 있는 타입

여기서 외부타입은 간단히 JSON 이라고 생까하자.

사용방법


Codable이 어떻게 이루어진 프로토콜인지 파악했다.

프로토콜을 사용하기 위해서는 채택 을 진행해야 한다는 것을 알고있다.

예제를 통해 사용방법을 알아보도록 하자.


struct Person {
    var name : String
    var age: Int
}

위와 같은 구조체가 있다고 가정했을떄, 위 구조체에 Codable을 적용해본다.


struct Person: Codable {
    var name: String
    var age: Int
}

여기서 : Codable 을 통해 Codable을 채택했다는 의미는 : Decodable, Encodable 과 동일하다.

Codable을 채택한 구조체 PersonA type that can convert itself into and out of an external representation -> 자신을 변환하거나 외부표현으로 변환할 수 있는 타입이 된다.

이를 이용해 JSON 타입으로 변환시켜본다.

let encoder = JSONEncoder()

외부표현(JSON)으로 변환하기 위해서는 해당 표현식의 인코더가 필요하다.

이후, Encode 하고싶은 Person 타입의 인스턴스를 만들어준다.

let yeojaeng = Person(name: "Yeojaeng", age: 27)

인스턴스를 만들었다면 Encoding을 진행한다.


let jsonData = try? encoder.encode(yeojaeng)

아까 만든 encoder의 인스턴스 메서드 encode를 이용해 인코딩한 결과값을 받아온다.

반환값인 Data를 정상적으로 받아오면 이를 바탕으로 Data를 변환시켜준다.


encoder.outputFormatting = .prettyPrinted

if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)   //{"name": "yeojaeng", "age": 27}
}


이게 끝!

모든 코드내용을 한번에 살펴보도록 한다.


struct person: Codable {
    var name: String
    var age: Int
}

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let yeojaeng = Person(name:"Yeojaeng", age:27)
let jsonData = try? encoder.encode(yeojaeng)

if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}
  1. JSONEncoder 선언

  2. JSONEncoder.encode() 메소드를 통해 인스턴스를 Data 타입으로 변환

  3. Data타입을 String타입으로 변환

이렇게 Codable을 이용해여 일반 타입의 데이터를 JSON 형태의 데이터로 변환할 수 있다.

이어서 인코딩한 결과값을 디코딩하여 원상복구 해보도록 한다.

let decoder = JSONDecoder()
// JSONDecoder 인스턴스 생성

var data = jsonString.data(using: .utf8)
// JSON -> Data 타입으로 변환

if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
    print(myPerson.naem)        // yeoajeng
    print(myPerson.age)         // 27
}

'iOS' 카테고리의 다른 글

[iOS] SnapKit  (0) 2020.05.13
[iOS] ViewController _ Lifecycle  (0) 2020.05.07
[iOS] 네비게이션 인터페이스와 모달  (0) 2020.04.20
[iOS] UISlider 공식문서 번역 및 공부  (0) 2020.04.19
[iOS] UIPickerView 공식문서 번역 및 공부  (0) 2020.04.19