어떻게...?
서버로부터 받아오는 JSON 데이터를 바로 사용할수는 없다. 이를 프로젝트 내에서 사용할 수 있는 타입으로 디코딩하여야 한다.
다음은 서버로부터 받아오는 JSON 데이터를 디코딩하는 예시이다.
// Parameter 1: JSON을 매핑시켜줄 Codable 프로토콜을 준수하는 사용자 정의 타입 대입
// Parameter 2: 서버에서 응답받는 JSON Data (== data)
guard let weatherInformation = try? decoder.decode(WeatherInformation.self, from: data) else { return }
Codable 프로토콜을 준수하는 사용자 정의 타입?
말은 복잡하지만 정리하자면 서버로부터 전달 받는 데이터를 저장할 수 있는 구조체이다.
이에 앞서 Codable 프로토콜을 알아보자.
Codable 프로토콜이란?
Codable 프로토콜이란 자기 자신을 변환하거나 외부 표현으로 변환할 수 있는 타입을 의미한다. 현재 외부 표현은 JSON 형식이 되겠다.
Codable 은 자체적으로 Decodable 과 Encodable 프로토콜을 준수하고 있으므로, JSON Encoding / Decoding 이 모두 가능하다.
예시
다음은 JSON 데이터를 매핑시켜줄 Codable 프로토콜을 준수하는 WeatherInfromation 구조체이다.
이를 통해 JSON ↔ WeatherInformation Struct 타입으로 양방향 변환이 가능하다.
struct WeatherInformation: Codable {
// 1. 현재 날씨의 정보를 답고 있는 JSON 데이터에서 필요한 프로퍼티만 구조체에 정의한다
// 3. key 와 일치하게 이름 선언
let weather: [Weather]
// 4. main 이라는 key 에 저장되어 있는 온도 정보를 매핑할 수 있게 프로퍼티를 정의해야 한다.
let temp: Temp
// JSON KEY "main" 과 매핑되어야 하므로
enum CodingKeys: String, CodingKey {
case weather
case temp = "main"
case name
}
let name: String
}
// 2. 먼저 Weather 배열에 있는 데이터를 가져와야 하므로 struct Weather 를 선언한다.
struct Weather: Codable {
// JSON 형태의 데이터로 변환하고자 하면, 기본적으로 JSON 타입의 KEY 와 사용자가 정의한 프로퍼티 이름과 타입이 일치해야 한다.
// 키와 프로퍼티 이름을 다르게 사용하고 싶다면, 타입 내부에서 Coding keys 라는 String 타입의 열거형을 선언하고 CodingKey Protocol을 준수하게 하여야 한다.
let id: Int
let main: String
let description: String
let icon: String
}
struct Temp: Codable {
// main key 에 있는 객체를 Temp 구조체에 매핑 시키기 위해 프로퍼티를 정의한다
// 사용하지 않을 key는 프로퍼티로 정의하지 않는다.
let temp: Double
let feelsLike: Double
let minTemp: Double
let maxTemp: Double
// 현재 Temp 구조체에 정의한 프로퍼티 이름은 JSON 데이터에 있는 Key 와 일치하지 않는다.
// 타입 내부에서 Coding keys 라는 String 타입의 열거형을 선언하고 CodingKey Protocol을 준수하게 하여아 한다.
enum CodingKeys: String, CodingKey {
case temp
case feelsLike = "feels_like"
case minTemp = "temp_min"
case maxTemp = "temp_max"
}
}
' iOS > UIKit' 카테고리의 다른 글
addArrangedSubview vs addSubview (Feat. SnapKit) (0) | 2022.10.02 |
---|---|
Swift Package Manager 을 통해 SnapKit 설치하기 (0) | 2022.10.01 |
NSCache 를 활용한 이미지 캐싱 (1) | 2022.09.30 |
IBOutlet Collection 은 왜 weak 수식어를 붙일 수 없을까? (3) | 2022.09.30 |
CALayer 와 CAAnimation (0) | 2022.09.23 |