使用する構造体を選択する(共通プロトコル、enum、Any)

共通プロトコルを使用して選ぶ

共通プロトコルを用いたAPIレスポンスの処理

APIから受け取った生データ(Data)を、内容に応じて異なるCodable構造体に変換する際の処理フローです。

1. プロトコルと構造体の定義

デコード対象となる全ての構造体(WeatherDataAstroData)に、空のプロトコルであるAPIResponseDataを準拠させます。

💡 ポイントAPIResponseDataプロトコルに**Codableを継承**させておくと、各構造体で個別にCodableを宣言する必要がなくなり、すっきりします。

2. 判別とデコードを実行する関数

APIから受け取ったDataを、まず判別用の構造体で一度デコードし、返す構造体を決定します。

3. 利用時のダウンキャスト

関数から返ってきたAPIResponseData?型の値は、そのままではcitysunriseといった具体的なプロパティにアクセスできません。利用する側で、as? を使って元の具体的な型にダウンキャストし、安全に処理を分岐させる必要があります。

列挙型(Enum)に構造体を関連値として持たせる

返される構造体の種類が限定的で少ない場合、列挙型に関数で返す構造体を関連値として持たせる方法も非常に有用です。

利点switch文によるパターンマッチングで、ダウンキャストなしで、型安全に全ての可能性を処理できます。

欠点: 返す可能性のある構造体の数が増えるほど、enumの定義やswitch文が長くなります。

Any または AnyObject (非推奨)

Swiftの全ての型を表す Any や、クラスインスタンスを表す AnyObject を戻り値の型にすることも可能ですが、型安全性が失われるため、特殊な理由がない限り推奨されません

利点: どんな型でも返すことができます。

欠点: 利用時に必ず as? でダウンキャストする必要があり、キャストに失敗すると実行時エラーになるリスクが高く、コンパイラの恩恵(型チェック)を全く受けられません。

コメント

タイトルとURLをコピーしました