안녕하세요. KataRN입니다.
오늘은 Codable에 대해 알아보겠습니다.
애플 공식 문서부터 보시죠.
Declaration을 보시면...
typealias Codable = Decodable & Encodable
결론이 났군요...
Codable은 뭐다? Decodable + Encodable !!!
그렇습니다. Decodable와 Encodable을 합친게 Codable입니다.
Encodable & Decodable 프로토콜을 준수하는 프로토콜입니다.
Struct, Class, Enum 모두 Codable을 채택할 수 있습니다.
그러면 Encoding와 Decoding를 알아야겠군요...
1. Encoding
- 자신을 외부표현(external representation)으로 인코딩 할 수 있는 타입
- 내가 원하는 struct, class, enum 등등의 인스턴스를 JSON 형태의 Data로 만들어주는 것
예제로 설명드릴게요.
간단한 Struct가 있습니다.
struct Person {
var name : String
var age : Int
}
Codable을 채택하였습니다.
struct Person : Codable {
var name : String
var age : Int
}
let kataRN = Person(name: "kata", age: 10)
이제 kataRN을 Encoding 해보겠습니다.
let jsonData = try? JSONEncoder().encode(kataRN)
이렇게 하면 끝!(Codable을 채택하지 않으면 오류납니다~)
그렇다면 try?를 사용하는 이유는????
이제 우리는 try가 무섭지 않습니다. 😎
try를 사용한다는건 Error가 발생할 가능성이 있다는것!
그리고 encode를 보면 throws가 있죠. Error가 발생할 수 있기 때문이죠
T????? 무섭지 않습니다! 😎
제네릭이네요 훗.. 가소롭다..
2. Decoding
- 자신을 외부표현(external representation)에서 디코딩 할 수 있는 타입
- JSON 형태의 Data를 struct, class, enum 등의 인스턴스에 자동으로 파싱해주는 것
예제 보시죠. (Struct는 똑같습니다.)
서버에서 보내는 Json 형태의 data를 제가 임의로 만들었습니다.
let data = """
{
"name" : "kata",
"age" : 10
}
"""
let decodeData = data.data(using: .utf8)!
이제 Decoding해보겠습니다.
let jsonData = try? JSONDecoder().decode(Person.self, from: decodeData)
역시 try?를 쓰는 이유는 똑같네요😎
type는 T.type 파라미터???가 필요하네요!!
여기에는 Person.self를 사용하면 됩니다!
여기까지는 보통 블로그에 있는 내용들인데...
한가지 궁금한게 생겼습니다. Codable을 쓰면 저 두개가 다 된다는건데...
안쓰면 어떡해야됨???
간단합니다.
Encoding를 할때에는 Encodable를 채택
Decoding를 할때에는 Decodable를 채택
구조체는 한개인데??? 두개 다 쓸때는??
Encodable, Decodable 둘다 채택...
굳이?? 그러므로 Codable만 채택!!!하면 똑같습니다. 😎
끝!!!... 하나만 더 공부합시다.
위의 예제를 보면 JSON Data의 "Key" 값(name, age)가 구조체의 변수 이름(name, age)와 동일하면, 그 변수의 값(name, age)에 Value("kata", 10)을 파싱하고 있습니다.
Key값이 다르면???
3. CodingKey사용하기
예제로 설명드립니다.
let data = """
{
"name2" : "kata",
"age" : 10
}
"""
let decodeData = data.data(using: .utf8)!
let jsonData = try? JSONDecoder().decode(Person.self, from: decodeData)
print(jsonData)
보시다싶이 서버에서 보내는 값인 data안의 name Key값을 name2로 바꿨습니다.
그러면 결과는 어떨까요?
넵 nil로 나옵니다. (실패했으니까~)
그러니까 CodingKey를 이용해보겠습니다.
이렇게 바꿔주면 결과는 잘 나옵니다~ 껄껄껄 😎
오늘도 긴글 읽어주셔서 감사합니다!! ㅎㅎ
'Old_SWIFT(221012) > 기본이야기' 카테고리의 다른 글
Closure에 대하여 - 2 (값 캡쳐, 캡쳐 리스트, ARC, 강한순환참조, 약한순환참조) (0) | 2022.10.08 |
---|---|
Closure에 대하여 - 1 (Trailing Closure, @autoclosure , @escaping) (1) | 2022.10.08 |
Result 타입에 대하여... (0) | 2022.10.05 |
Error타입부터 try, do, catch까지...(모든건 Result 타입을 위해) (1) | 2022.10.05 |
Property Wrapper에 대하여 (0) | 2022.10.05 |