본문 바로가기

Codes Travel/iOS Boost Course #2019

Codable?

 

안녕하세요 :)

iOS 개발자 리치(rich_iosdev)입니다.


공유해드릴 내용은 Codable 입니다.

Codable

A type that can convert itself into and out of an external representation.

 

애플 공식 문서상에서 정의된 Codable은 외부 표현으로 변환될 수 있는? 타입이다? 라고 되어 있는 것 같은데요.

정확히 이해하기 어려워서 부스트코스 강의 정의를 다시 한번 봤습니다.

 

"인코딩과 디코딩에 사용되는 프로토콜" 이다.

 

이게 좀 더 이해하기 쉬운 것 같네요.

 

인코딩과 디코딩에 대한 이해는 하고 계신다는 전제로 설명드리겠습니다

Codable은 Swift4 부터 사용할 수 있는 프로토콜이구요.

간단히 말해서 JSON 데이터를 서버에서 받아오면 굉장히 간편하게 디코딩 할 수 있도록 만들어 주는 놈입니다.

 

typealias Codable = Decodable & Encodable

Codable의 Decodable이 이런 작업을 도와주는데요.

 

좀 더 직관적인 이해를 위해서 샘플 코드를 구현해 보았습니다.

struct City: Decodable {

    let name: String
    let id: Int
    let weather: [Weather]
    let main: Main
}

struct Weather: Decodable {
    
    let main: String
    let description: String
    let icon: String
    
}

struct Main: Decodable {

    let temp: Float
    let pressure: Float
    let humidity: Float
    let tempMin: Float
    let tempMax: Float
    var seaLevel: Float?
    var grndLevel: Float?

    private enum CodingKeys: String, CodingKey {
        case temp, pressure, humidity
        case tempMin = "temp_min"
        case tempMax = "temp_max"
        case seaLevel = "sea_level"
        case grndLevel = "grnd_level"
    }
}

 

우선 위 코드는 서버 API를 호출 했을 때 받아오는 JSON 데이터의 Format(양식)에 따라서 다릅니다. 화면에 보여주고자 하는 데이터들의 프로퍼티와 타입을 정의해주는 것입니다.

 

여기서 각 구조체 마다 'Decodable' 이라는 프로토콜이 채택되어있는데요. Codable을 채택하셔도 상관 없습니다.

import Foundation

class OpenWeatherAPI {
    
    static let shared = OpenWeatherAPI()
    
    init() {}
    
    func fetchWeatherDataByCoordinate(latitude: Double, longitude: Double, completion: @escaping (City?, Error?) -> ()) {
        let urlString = "http://api.openweathermap.org/data/2.5/weather?lat=\(latitude)&lon=\(longitude)&units=metric&APPID=\(개발자개인키값)"
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, res, err) in
            if let err = err {
                print(err.localizedDescription)
                print("Failed to fetch weather data...")
                return
            }
            do {
                let jsonResult = try JSONDecoder().decode(City.self, from: data!)
                completion(jsonResult, nil)
            } catch let err {
                completion(nil, err)
            }
        }.resume()
    }
}

위 코드에서는 Decodable 프로토콜을 채택한 City라는 구조체를 활용해서 JSONDecoder()로 디코딩 작업 수행을 구현한 것입니다.

이렇게 jsonResult 라는 변수에 담아서 원하는 화면 UI에 데이터를 보여줄 수 있습니다

 

물론 구현된 코드는 데이터를 가져오는 메서드까지만 나와있어서 연결된 부분을 이해하기 어려울 수 있지만

기본적인 Codable 활용법을 다뤘기 때문에 여기까지만 일단 설명드리도록 할게요

 

잘못된 부분이 있다면 꼭 댓글 부탁드립니다!

확인해서 수정하도록 할게요!!

 

끝까지 읽어주셔서 정말 감사합니다 :)

 

Reference

 

[부스트코스] iOS프로그래밍

Codable?

https://www.edwith.org/boostcourse-ios/lecture/18732/

 

[LECTURE] 1) Codable : edwith

Codable 인코딩(Encoding)과 디코딩(Decoding)이 무엇인지 알아보고, 인코딩과 디코딩에 사용되는 Codable 프로토콜에 대해 알아봅니다. 학습 목표 1. 코딩과... - 부스트코스

www.edwith.org

https://developer.apple.com/documentation/swift/codable

 

Codable - Swift Standard Library | Apple Developer Documentation

Codable is a type alias for the Encodable and Decodable protocols. When you use Codable as a type or a generic constraint, it matches any type that conforms to both protocols.

developer.apple.com

'Codes Travel > iOS Boost Course #2019' 카테고리의 다른 글

비동기 프로그래밍  (0) 2019.08.22
Photos 프레임워크 활용하기!  (0) 2019.08.22
UITableView - DataSource & Delegate  (0) 2019.08.05
세그 (Segue) ?  (0) 2019.08.01
뷰의 재사용 이란?  (0) 2019.08.01