Old_SWIFT(221012)/기본이야기

Codable에 대하여(Decodable, Encodable, CodingKey)

KataRN 2022. 10. 6. 23:51
반응형

안녕하세요. KataRN입니다.

 

오늘은 Codable에 대해 알아보겠습니다.

 

애플 공식 문서부터 보시죠.

 

Declaration을 보시면...

typealias Codable = Decodable & Encodable

결론이 났군요...

Codable은 뭐다? Decodable + Encodable !!!

 

그렇습니다. Decodable와 Encodable을 합친게 Codable입니다.

 

Encodable & Decodable 프로토콜을 준수하는 프로토콜입니다.

StructClassEnum 모두 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를 이용해보겠습니다.

d

이렇게 바꿔주면 결과는 잘 나옵니다~ 껄껄껄 😎

 

오늘도 긴글 읽어주셔서 감사합니다!! ㅎㅎ

 

 

반응형