2

return JSON(["foo":"bar"])私の質問は、 Vapor JSON 関数呼び出しとの違いは何return try JSON(node: ["foo":"bar"])ですか?

両方のバリアントが機能します。正しい方法は何ですか?

return JSON(node: ["foo":"bar"])またはのようにそれらを混在return try JSON(["foo":"bar"])させると、ビルドが失敗します。

import Vapor

let drop = Droplet()

drop.get("json") { req in
  return JSON(["foo": "bar"])
}

drop.run()
4

1 に答える 1

6

これで答えられると思います。一見すると、これらは非常に似ているように見えますが、大きく異なります。これら 2 つのイニシャライザですべてが戻ってくる唯一の理由は ... GENERICS です。

外部引数なし

上記を参照する外部引数初期化子はありませんJSON(["foo": "bar"])。これらは、JSON で直接表現できる型の失敗しない初期化子に使用します。たとえば、、、、、など. [String: JSON]_String[JSON]Number(Int, UInt, Double)

あなたは、「ちょっと待ってください。私は[String: String]上を通り過ぎています。まあ、これが問題です...実際にはそうではありません。JSON is ExpressibleAsStringLiteralso ["foo": "bar"]aboveは実際には["foo": JSON("bar")]引数なしのイニシャライザを使用できるようになります。

外部引数ありnode:

失敗可能イニシャライザと失敗可能でないイニシャライザに同じ外部パラメータを使用できなかったため、外部引数を使用してコンパイラが曖昧さをなくします。

イニシャライザに目を通すとnode:、これは一連の一般的なオーバーロードであり、作業を容易にします。上記のように["foo": "bar"]、 に変換されるため、直接渡すことができると述べました[String: JSON]。具体的な型があり、[String: String]それを使おうとするJSON(stringDict)と失敗します。ただし、try JSON(node: stringDict)ジェネリックを使用すると、ジェネリックを使用してそれを知ることStringができNodeRepresentible、JSON に適切に変換するのに十分なコンテキストが得られます。または、少なくとも試してみてください!

初期node:化子を使用することで、複数の異なるジェネリック バリアントを許可し、複数の異なる型を操作できます。

:)

これでいくつかの問題が解決することを願っています。これはコード ベースのかなり微妙な領域であり、喜んで詳しく説明します。

于 2016-12-13T17:44:02.160 に答える