안녕하세요
오늘은 저번 글에 이어 Codable, Codingkey에 대해서 공부해보겠습니다.
먼저 공식문서를 보겠습니다.
"자신을 변환하거나 외부표현으로 변환할 수 있는 타입이다."라는 설명이 있네요.
Declaration을 보시면,
Decodable
프로토콜과 Encodable
프로토콜을 포함한 typealias라는 것을 알 수 있습니다.
Decodable
프로토콜은 디코딩할 때 사용하고 Encodable
프로토콜은 인코딩 할 때 사용하겠죠?
Codable
은 Class, Struct, Enum에서 모두 사용할 수 있습니다.
지난편의 예제를 가져오겠습니다.
struct User: Codable {
let userId: Int
let name: String
let emailAddress: String
}
Codable
을 채택하여 struct
를 만들어 주었습니다.
만약에 인코딩만 한다? 그러면 Encodable
프로토콜만 채택하여 사용할 수 있습니다.
반대로 디코딩만 한다면 Decodable
프로토콜만 채택하여 사용할 수 있겠네요!
이렇게 만들어주면 됩니다. 쉽죠?
그리고 저번 예제 약간 다른 JSON파일을 만들었습니다.
struct User: Codable {
let userId: Int
let name: String
let emailAddress: String
}
{
"user_id": 1,
"user_name": "Kale",
"user_emailAddress": "kale@test.com"
}
struct의 프로퍼티 이름과 JSON의 키값이 같다면 그대로 사용하면 되지만 위처럼 서버에서 던져주는(서버에서 JSON형식을 던져준다고 가정) 키값이 swift의 네이밍 가이드에 맞지 않는다면 이름을 변경하여 사용하여야 하겠죠.
이럴 때 Codingkey를 사용하면 좋습니다.
struct User: Codable {
let userId: Int
let name: String
let emailAddress: String
enum CodingKeys: String, CodingKey {
case userId = "user_id"
case name = "user_name"
case emailAddress = "user_emailAddress"
}
}
struct
안에서 enum
을 선언하여 Codingkey
를 채택해줍니다.
rawValue를 사용하기 위해 String도 적어줍니다.
그리고 case에는 프로퍼티와 같은 이름을 적어주고 rawValue로 JSON에 설정되어 있는 키값을 적어줍니다.
여기서 enum
의 이름을 Codingkeys로 하지 않으면 프로퍼티과 매핑이 되지 않는 것으로 보입니다.
이유는 아직 찾지 못했네요.. 알고 계신분이 있다면 알려주세요!!
위와 같이 Codable
과 Codingkey
를 사용하면 JSON의 키값과 타입의 프로퍼티를 매핑시켜줄 수 있습니다.
JSON 디코딩 하는 방법은 지난 편에 있습니다!
JSON파일 Decode하기 (feat. Codable)
감사합니다.