Codable 자신을 변환하거나 외부표현(external representation)으로 변환할 수 있는 타입입니다.
Codable = Decodable & Encodable
- Decodable = 자신을 외부표현에서 디코딩 할 수 있는 타입
- Encodable = 자신을 외부표현으로 인코딩 할 수 있는 타입
채택할수 있는 인스턴스의 종류
- Class
- Struct
- Enum
Encoding 예시
순서.
-
JSONEncoder선언
-
위 JSONEncoder의 encode메소드를 사용하여 인스턴스를 Data타입으로 만듬
-
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
-
여기서 T는 encode안에 올수 있는 값은 Encodable을 준수하고 있는 타입이여야 합니다. Codable을 상속한 클래스인 Person은 준수하고 있는 타입입니다.
-
그리고 여기서 throws는 에러를 발생시킬 수 있기 때문에 try와 함께 써주어야 합니다.
-
그리고 리턴부분을 보면 Data라고 되어있습니다.
-
인코딩 완류후의 코드를 보면 if let을 써서 옵셔널 바인딩을 써주었는데 try?로 했기 때문에 나오는 값이 Optional값이기 때문입니다. return 값 = String(data:, encoding:)
-
파일에 저장된 데이터의 생김새가 {"name:"Hyeongyu", "age":29 } 이렇게 생겼는데 encoder.outputFormatting = .prettyPrinted
{
"name" : "Hyeongyu"
"age" : 29
}
위의 코드를 넣으면 이렇게 바뀌게 됩니다.
Decoding 예시
순서
-
JSONDecoder선언
-
우리의 JSON. 즉 String타입을 Data타입으로 만듬
-
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할 값의 타입이다. 리턴되는 타입값.
'IOS > Swift' 카테고리의 다른 글
다형성(Polymorphism)과 추상화(Abstraction)의 관계 (0) | 2022.03.27 |
---|---|
UserDefault 깔끔하게 쓰는 법 공유합니다 (0) | 2022.03.09 |
[TIL] Swift. Closure (0) | 2020.10.19 |
[TIL] Swift. Type Casting(feat. is, as) (0) | 2020.10.18 |
[TIL] Swift. GCD (Grand Central Patch) (0) | 2020.10.17 |