Codable
Codable프로토콜은 Encodable과 Decodable이 합쳐진것이다.
Encodable은 모델을 bytes 형식의 데이터로 변환하는것이고
Decodable은 반대로 bytes 형식의 데이터를 모델로 변환하는것이다
ex)
data -> Json (Decode)
Json -> Data (Encode)
Codable을 채택했을때 아래와 같은 오류가 뜨는 경우가 있는데
Type 'Object' does not conform to protocol 'Decodable'
Type 'Result' does not conform to protocol 'Encodable'
이는 Codable을 채택한 오브젝트내의 저장속성이 Codable을 채택한 타입이 아니라서 오브젝트가 자동으로 Codable을 채택한것이 아니라서 직접 Decodable과 Encodable을 구현해주어야 한다.
자동으로 Codable 프로토콜 준수
Codable을 채택한 Class 또는 Struct의 저장속성이 전부 Codable을 채택한 타입으로 선언하면 따로 Decodable과 Encodable을 정의해주지 않아도 자동으로 Codable 프로토콜을 따르게 된다 Codable을 지원하는 타입은 Int, Double, String, Data, Date, Url등과 같이 Foundation 타입이다
UIImage와 같이 UIKit의 타입들은 Codable을 채택하고 있지 않기 때문에 오류가 발생한다
CodingKey
Swift에선 카멜 표기법을 사용한다. 하지만 Json데이터를 보면 스네이크 표기법을 사용하는 경우가 많다
예를 들어 보자
let json = """
{
"first_name" = "junbok",
"last_name" = "lee
"age" = 99
}
"""
codable을 채택한 모델에 Json을 파싱하려면 키값과 벨류타입이 일치해야 디코딩이 성공하기 때문에 위의 json을 토대로 모델을 작성해보면 아래와 같아진다
struct Person: Codable {
let first_name: String
let last_name: String
let age: Int
}
하지만 앞서말한것 같이 swift는 카멜 표기법을 따른다. 하지만 입력받은 json데이터는 스네이크 표기법을 따른다.
모델의 키값을 내 마음대로 카멜표기법으로 바꾼다면 json을 디코딩해봤자 키값이 일치하지 않기때문에 오류가 발생할 것이다
// decode 오류발생
struct Person: Codable {
let firstName: String
let lastName: String
let age: Int
}
그럼 Person데이터를 사용할때마다 스네이크 표기법을 계속 사용해야하는가 ?? 이때 등장하는 것이 CondingKey이다.
그럼 CondingKey는 어떻게 사용하는지 알아보자
let json = """
{
"first_name" = "junbok",
"last_name" = "lee
"age" = 99
}
"""
struct Person: Codable {
let firstName: String
let lastName: String
let age: Int
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
case age
}
}
먼저 json의 키값이 String이기 때문에 원시값의 타입을 String으로 지정해주고
json에 key값이 각각 "first_name", "last_name", "age" 이렇게 3개가 있지만
우리는 swift 내부에서 각각 "firstName", "lastName", "age" 로 바꿔줄 것이기 때문에 이에 맞춰 case를 추가해주고
키값을 바꾸고싶은 firstName과 lastName의 원시값에 기존 json의 key값인 first_name과 last_name을 넣어주면 된다.
CodingKey 채택시 주의사항
기본적인 사항인데 열거형으로 선언한 값과 클래스/구조체에 선언한 저장속성과 일치하지 않으면 에러가 발생한다
물론 개수도 다 맞아야한다 많거나 적어도 에러가 발생한다.
'iOS > iOS' 카테고리의 다른 글
[iOS] 시뮬레이터를 실행하지 않고 SwiftUI를 활용하여 UIKit 앱 미리보기 (0) | 2023.02.25 |
---|---|
[iOS] 화면 터치 시 키보드 내리기 (0) | 2023.02.14 |
[iOS] 커스텀 UITableViewCell 만들기 및 하나의 테이블뷰에 여러개의 셀 보여주기 (0) | 2023.02.04 |
[iOS] Xcode Stroyboard 없이 시작하기 (0) | 2023.02.02 |
[iOS] UIStackView (0) | 2023.01.23 |