【问题标题】:How to encode a mixed-value-type dictionary to JSON in Swift 4.1如何在 Swift 4.1 中将混合值类型字典编码为 JSON
【发布时间】:2018-04-11 12:32:29
【问题描述】:

以下代码在 Xcode 9.2 (Swift 4.0) 中有效,但在 Xcode 9.3 (Swift 4.1) 中出错。

let dict: [String: Any] = [
    "status_code": 5,
    "status_message": "message"
]

let data = try! JSONEncoder().encode(dict)
                           // ^  generic parameter 'T' could not be inferred

我尝试制作字典[String: Encodable],并对两种字典类型使用typealias,结果相同。 Swift 不允许您在泛型调用中指定类型,因此会产生编译器错误。这在 Swift 4.1 中应该是什么样子?

【问题讨论】:

  • 如果您正在寻找解决方案,那么您应该使用Struct 而不是Dictionary
  • @LucaAngeletti 我确实为我的实际代码使用了结构。这是在一个单元测试中,我正在构建一个非典型响应,所以我想保持它的松散类型。如果需要,我可以在函数中定义一个临时结构,但如果可能的话,我想使用字典
  • Encodable 是一种协议,而不是一种类型。

标签: json swift swift4.1


【解决方案1】:

字典可以编码吗?

在 Swift 4.1 中,仅当 KeyValue 本身是 Encodable 时,Dictionary<Key, Value> 才符合 Encodable

Encodable(s) 字典示例

[String:Int]
[String:String]
[String:Double]

Encodable(s)字典示例

[String:Any]
[String:UIView]

那么,你怎么能解决你的问题呢?

结构

使用模型值可能是最好的解决方案

struct Status: Codable {
    let statusCode: Int
    let statusMessage: String
}

let status = Status(statusCode: 45, statusMessage: "message")
let data = try? JSONEncoder().encode(status)

【讨论】:

  • 但如果这是唯一的原因,那为什么[String: Encodable] 不起作用?
  • @Dov Encodable 不是具体类型,因此无法使用
  • @Jeremiah 谢谢,我想我没有发现字典中的值必须具有具体类型
  • 在这种情况下,您将如何处理动态属性列表?例如,如果不需要上面的 statusMessage 怎么办?使用字典,您只需将其省略,但我看不出这在结构中是如何实现的。
猜你喜欢
  • 2021-10-30
  • 2019-01-13
  • 1970-01-01
  • 2022-01-11
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多