NokkunBlog

Keep technology simple.

Swiftで祝日を取得する

祝日を取得するためのメモ。

JSON形式で取ってこれる以下のサイトがあったので、こちらから取ってくるようにした。

https://holidays-jp.github.io

去年、今年、来年の3年分のデータがとってこれる。

{
  "2017-01-01": "元日",
  "2017-01-02": "元日 振替休日",
  "2017-01-09": "成人の日"
}

デコードするための構造体を作って、デコードしてあげるだけ。

(JSONのキーが一意でない今回のようなケースは、Dynamic Keyと呼ばれるらしい。

{ “date”:”2001-01-01″ } みたいにキー名が固定のケースが多かったからびっくり。)

class HolidayJP : ObservableObject{

    var data:[String:String] = [:]
    
    init() {
        loadData(completion: { result in
            self.data = result.dict
        })
    }
    
    struct Holiday: Decodable {
        
        let dict : [String:String]
        
        init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            let dict = try container.decode([String:String].self)
            self.dict = dict
        }
    }
        
    func loadData(completion:@escaping (Holiday) -> ()) {
            
        let url_string = "https://holidays-jp.github.io/api/v1/date.json"
        
        let url = URL(string: url_string)!
        let request = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: request) {(data, response, error) in  //非同期で通信を行う
            guard let data = data else { return }
            
            let decoder = JSONDecoder()
            guard let decodedResponse = try? decoder.decode(Holiday.self, from: data) else {
                print("Json decode エラー")
                return
            }
            
            completion(decodedResponse)
            
        }
        
        task.resume()
        
    }

}