Kos*_*ika 2 json function swift swift3 vapor
我的问题是Vapor 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()
Run Code Online (Sandbox Code Playgroud)
我想我可以回答这个问题.乍一看,这些看起来非常相似,但它们非常不同.在这两个初始化器中所有内容都回归的唯一原因是...... 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:初始化程序,我们可以允许多个不同的通用变体并使用多种不同类型.
希望这能解决一些问题,这是代码库中一个非常细微的区域,很高兴能够详细说明.