あなたがしていることよりもエレガントな方法は考えられませんが、さらに私がしたことは、コンストラクターでチェックを移動することでした。実装のために行うことは、データ転送オブジェクトに逆シリアル化できる各クラスです。辞書をパラメーターとして受け取るコンストラクターの実装を提供する必要があります。辞書は、API から取得した json です。明らかに、プロキシ層で、実際に逆シリアル化でき、null ではなく、辞書として表現できることを確認しています。
API 呼び出しが何らかの不適切な応答 (プロキシ レイヤーから一般的に処理される) を返すか、その呼び出しに必要なコントラクト (DTO に変換される) を返す可能性があることを知っているので、何が返されるかについていくつかの仮定を立てることができます。
何かが戻ってこない可能性がある場合、これが複雑なプロジェクトでない限り、次のようにコンストラクターでこれらの種類のチェックを行うことでおそらく逃げることができます。
required init(dict dictionary: NSDictionary)
{
self.id = dictionary["id"] as Int
self.foo = dictionary["foo"] as String
self.user = ( (dictionary["user"] == nil) ? User() : User(dictionary["user"]))
}
ここで、nil の場合は新しいユーザー オブジェクトを返しますが、nil のままにしておくこともできます。そうでない場合は、「ユーザー辞書」(元の JSON の子、この場合は {"id":2})をユーザー クラス コンストラクターに渡します。ほとんど同じことを行いますが、ユーザー オブジェクトをハイドレートします。 .
ユーザークラスは次のようになります。
required init(dict dictionary: NSDictionary)
{
self.id = (dictionary["id"] as Int)
}