IOS/Swift

Codable & Encodable

Codable 자신을 변환하거나 외부표현(external representation)으로 변환할 수 있는 타입입니다.

Codable = Decodable & Encodable

  • Decodable = 자신을 외부표현에서 디코딩 할 수 있는 타입
  • Encodable = 자신을 외부표현으로 인코딩 할 수 있는 타입

채택할수 있는 인스턴스의 종류

  1. Class
  2. Struct
  3. Enum

Encoding 예시

순서.

  1. JSONEncoder선언

  2. 위 JSONEncoder의 encode메소드를 사용하여 인스턴스를 Data타입으로 만듬

  3. Data타입을 String타입으로 만듬

struct Person {
	var name: String
	var age: Int
}
// Codable 채택
struct Person: Codable {
	var name: String
	var age: Int
}
// 인코더 선언
	let encoder = JSONEncoder()
// 인스턴스 만들기
let Hyeongyu = Person(name: "Hyeongyu", age: 29)
//인코딩
	let jsonData = try? encoder.encode(Hyeongyu)
// 완료후
	if let jsoData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString)} // {"name:"Hyeongyu", "age":29 }
encoder.outputFormatting = .prettyPrinted 

open func encode<T>(_ value: T) throws → Data where T: Encodable

  1. 여기서 T는 encode안에 올수 있는 값은 Encodable을 준수하고 있는 타입이여야 합니다. Codable을 상속한 클래스인 Person은 준수하고 있는 타입입니다.

  2. 그리고 여기서 throws는 에러를 발생시킬 수 있기 때문에 try와 함께 써주어야 합니다.

  3. 그리고 리턴부분을 보면 Data라고 되어있습니다.

  4. 인코딩 완류후의 코드를 보면 if let을 써서 옵셔널 바인딩을 써주었는데 try?로 했기 때문에 나오는 값이 Optional값이기 때문입니다. return 값 = String(data:, encoding:)

  5. 파일에 저장된 데이터의 생김새가 {"name:"Hyeongyu", "age":29 } 이렇게 생겼는데 encoder.outputFormatting = .prettyPrinted

{
	"name" : "Hyeongyu"
	"age" : 29
}

위의 코드를 넣으면 이렇게 바뀌게 됩니다.

Decoding 예시

순서

  1. JSONDecoder선언

  2. 우리의 JSON. 즉 String타입을 Data타입으로 만듬

  3. Data타입을 JSONDecoder의 decode메소드를 사용하여 인스턴스로만듬

// 디코더 생성
let decoder = JSONDecoder()
// 
var data = jsonString.data(using: .utf8)
// 디코더를 사용해서 data -> 인스턴스
if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
	print(myPerson.name) // Hyeongyu
	print(myPerson.age) // 29
}

decode<T>(_ type: T.Type, from data: Data) throws → T where T : Decodable

  • 여기서의 Type은 decode할 값의 타입이다. 리턴되는 타입값.