2

SwiftyJSON ( https://github.com/SwiftyJSON/SwiftyJSON ) を使用しています。次の 2 つの形式のいずれかの JSON 応答があるとします。

{
    "id": 1,
    "foo": "bar"
}

または

{
    "id": 1,
    "foo": "bar",
    "user": {"id": 2}
}

JSON に「user」要素が存在する場合にのみ、Swift オブジェクトの「user」属性を更新したいと考えています。今、私はこれをやっています:

let userJson = json["user"]
if userJson.type != .Null && userJson.type != .Unknown {
    user = User.create(userJson)
}

これを処理するより良い方法はありますか?たとえば、Swift のif-let構文を使用しますか?

4

2 に答える 2

2

あなたがしていることよりもエレガントな方法は考えられませんが、さらに私がしたことは、コンストラクターでチェックを移動することでした。実装のために行うことは、データ転送オブジェクトに逆シリアル化できる各クラスです。辞書をパラメーターとして受け取るコンストラクターの実装を提供する必要があります。辞書は、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)
 }
于 2014-12-17T05:09:49.207 に答える
1

SwiftyJSON では、オブジェクトが存在するかのように使用できるため (ユーザー オブジェクトが返された場合にユーザー ID が常に存在すると仮定すると)、以下をチェックとして使用して、物事を少し単純化することもできます。

if let userId = json["user"]["id"].string {
  user = User.create(json["user"])
} else {
  // Do something else, or just ignore it.
}
于 2014-12-17T05:14:35.767 に答える