ジェネリクスを使ったWebAPI経由でのデータ(JSONフォーマットによるデータ)取得のクラスメソッドを作ってみました。

ネット接続(HTTP接続)やJSONデコードには外部のフレームワークはつかっていません。AlamofireSwiftyJSONを使っても良いのですが、とりあえずはシンプルな形にしてみました。

Swift5でのJSON形式のダウンロードでは、ダウンロードしたいJSONのフォーマットに従って構造体を作り、その構造体をJSONDecoder().decodeで指定することで希望するデータを取得することができます。

ただ、実際にデータを取得するURLSession.shared.dataTaskの処理はクロージャで行っているため、取得したデータを使うためにはもうひと工夫必要となります。

いくつか方法がありそうですが、ここでは一般的に行われているように、ダウンロードしたデータを処理するためのクロージャを指定することで、必要な処理を異なったスコープで行えるようにしてみました。

また、ジェネリクスを使うことで、JSONフォーマットが異なっても汎用的に使えるようにしてみました。

以下は、日本におけるコロナウィルス感染者数の情報を提供しているサイトから、国内の発生事例をJSONフォーマットで取得する例です。

クラスの型としてCodableに準拠した構造体を指定し、クラスメソッド(getData(urlAsString: completion:))でデータを取得します。第一引数は接続先のURLをString型で、第二引数では取得完了後の処理をクロージャとして渡します。

アプリの詳細をきめていくと、接続先のサーバが返すステータスコードなどに応じてJSONのフォーマットを変更したいなど、さらに細かい処理が必要になってくるため、このような汎用的なコードでは対応できない場合も出てきますが、とりあえずプロトタイプを作るような場合には使えるのではないかとおもいます。

次の例は同じサイトから都道府県別の感染者数リストを取得する例です。この例では、トップレベルで配列になっているJSONフォーマットを取得するため、構造体を配列の形で渡す必要がありますが、それにも同じ方法で対処できることがわかるかと思います。

ジェネリクスを使うのはほぼ初めてなのでこれで良いのか、という疑問は残っていますが、とりあえず最低限の範囲で汎用化することはできました。