[英]Swift Vapor framework difference in JSON function calls
我的問題是,蒸氣JSON函數調用與return JSON(["foo":"bar"])
vs 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()
我想我可以回答這個問題。 乍一看,它們看起來很相似,但是卻有很大不同。 在這兩個初始化程序中返回所有內容的唯一原因是... GENERICS。
沒有外部arg初始化程序引用上面的JSON(["foo": "bar"])
。 對於無法直接在JSON中表示的類型,我們將它們用於不可失敗的初始化程序。 例如, [String: JSON]
, String
, [JSON]
, Number(Int, UInt, Double)
等。
您可能會說:“等等,我正在上面傳遞[String: String]
。這是事實……實際上我們不是。JSON是ExpressibleAsStringLiteral
因此上面的["foo": "bar"]
實際上變成了["foo": JSON("bar")]
並允許我們使用無參數初始化程序。
node:
我們使用外部參數來幫助編譯器消除歧義,因為我們無法將相同的外部參數用於可失敗的初始化程序和不可失敗的初始化程序。
如果查看一下node:
初始值設定項,則它是一組通用的重載,使我們可以使事情變得更容易。 如上所述,我們可以直接傳遞["foo": "bar"]
,因為它可以轉換為[String: JSON]
。 好吧,如果我們的類型具體為[String: String]
並且嘗試使用JSON(stringDict)
它將失敗。 但是,如果我們使用try JSON(node: stringDict)
則可以使用泛型來知道String
是NodeRepresentible
並且我們有足夠的上下文將其正確轉換為JSON。 或至少嘗試!
通過使用node:
初始值設定項,我們可以允許多個不同的泛型變體並使用多種不同的類型。
希望這可以清除一些問題,這是代碼庫中相當細微的區域,樂於詳細說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.