Coding Key
- 서버에서 보내주는 키값과 앱에서 사용하는 키값 이름을 다르게 하고 싶을때 사용
- 서버에서는 “Name” 이렇게 보내주고 있고, swift 에서는 보통 변수 명을 카멜케이스로 사용하기 때문에 “name” 으로 받고 싶어 할 것
- 이럴때 사용할 수 있는 것이 Coding key
struct Person: Codable {
let name: String?
let height: Int?
}
이러한 구조체인데..
let jsonData = """
{
"name" : "jung",
"height" : 100
}
""".data(using: .utf8)!
jsonData 를 서버에서 받은 JSON 데이터라고 가정해보겠습니다
디코딩을 해보면

이렇게 값이 잘 나옵니다
근데 이때 아래와 같이 swift 에서 잘 쓰는 카멜케이스가 아닌 다른 형식으로 데이터를 보내준다면?
let jsonData = """
{
"Name" : "jung",
"Height" : 100
}
""".data(using: .utf8)!

nil 이 발생하게 된다…
이럴때 사용가능한게 coding key
coding key 는 서버에서 보내주는 키값을 내 맘대로 바꾸고 싶을때 사용!
struct Person: Codable {
let name: String?
let height: Int?
enum CodingKeys: String, CodingKey {
case name = "Name" // Name 이 서버에서 보내주는 key 값, name 이 앱 단에서 사용할 key 값
case height = "Height"
}
}
enum CodingKeys: String, CodingKey 을 통해서 내가 원하는 키 값으로 변경해 줄 수 있습니다
결과물!

Init decoding
- 만약 서버에서 키값 이름을 아예 다르게 주거나, 키를 아예 안줬을때 대응할 수 있음
- 키가 없을때, value에 원하는대로 기본값 지정이 가능합니다
struct Person: Codable {
let name: String?
let height: Int?
enum CodingKeys: String, CodingKey {
case name = "Name"
case height = "Height"
}
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decodeIfPresent(String.self, forKey: .name)
self.height = try container.decodeIfPresent(Int.self, forKey: .height)
}
}
우선 위 코드에서 init() 함수 부분은 struct 내부에서 init 을 치면 자동완성이 된 코드입니다
이 상태에서
let jsonData = """
{
"nnnname" : "jung",
"hhheight" : 100
}
""".data(using: .utf8)!
이러한 서버 데이터를 받았다면..?

디코딩 했을때 nil 을 내뱉게 되는데요
이런 당황스러운 키값을 받게되더라도 nil 대신 기본값을 지정해 줄 수 있습니다!
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decodeIfPresent(String.self, forKey: .name) ?? "기본이름"
self.height = try container.decodeIfPresent(Int.self, forKey: .height) ?? 0
}
기존 init 함수에서 decodeIfPresent 함수에 ?? “value” 를 붙여주었습니다
(옵셔널이 아닌 타입이라면 decode 함수를 사용해주면 됩니다)
nil 이 나온다면 기본값 value 를 지정해주는 방식입니다

이렇게 value 가 없더라도 기본값을 지정해줄 수 있습니다
그럼 데이터가 아예 비었다면??

데이터가 비었더라도 기본값이 지정되네요
아 그럼 데이터가 하나만 온다면??

맞는 키값이 있으면 데이터를 잘 주고, 키 값이 없다면 기본값으로 지정이 되네요!
이제 서버에서 값을 받을 때는 매번 옵셔널을 처리해주기보다는 받을때 아예 기본값으로 처리해주는 방식이 보기 좋아보이니 습관화해야겠네요~