2

我的问题是 Vapor JSON 函数调用return JSON(["foo":"bar"])与有什么区别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

我想我可以回答这个问题。乍一看,它们看起来非常相似,但它们却大不相同。一切都回到这两个初始化程序中的唯一原因是...... 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:初始化器,我们可以允许多种不同的泛型变体并使用多种不同的类型。

:)

希望这可以解决一些问题,这是代码库中一个非常细微的区域,很高兴能详细说明。

于 2016-12-13T17:44:02.160 回答