【问题标题】:Swift Vapor framework difference in JSON function callsJSON函数调用中的Swift Vapor框架差异
【发布时间】:2016-12-10 00:11:23
【问题描述】:

我的问题是 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()

【问题讨论】:

标签: json swift function swift3 vapor


【解决方案1】:

我想我可以回答这个问题。乍一看,它们看起来非常相似,但它们却大不相同。一切都回到这两个初始化程序中的唯一原因是...... GENERICS。

没有外部参数

没有外部参数初始化器引用上面的JSON(["foo": "bar"])。我们将这些用于 non-failable 初始化器,用于可以直接用 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: 初始化器,我们可以允许多种不同的泛型变体并使用多种不同的类型。

:)

希望这可以澄清一些事情,这是代码库中一个非常细微的区域,很高兴能详细说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2016-07-12
    • 2017-05-31
    • 1970-01-01
    • 2012-01-04
    • 2012-07-18
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多