我有一个实现Swift 4的Codable的 struct .有没有一种简单的内置方法可以将该 struct 编码到字典中?

let struct = Foo(a: 1, b: 2)
let dict = something(struct)
// now dict is ["a": 1, "b": 2]

推荐答案

如果你不介意周围的数据发生一些变化,你可以使用以下方法:

extension Encodable {
  func asDictionary() throws -> [String: Any] {
    let data = try JSONEncoder().encode(self)
    guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
      throw NSError()
    }
    return dictionary
  }
}

或者可选的变体

extension Encodable {
  var dictionary: [String: Any]? {
    guard let data = try? JSONEncoder().encode(self) else { return nil }
    return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
  }
}

假设Foo符合CodableEncodable,那么你可以这样做.

let struct = Foo(a: 1, b: 2)
let dict = try struct.asDictionary()
let optionalDict = struct.dictionary

如果你想走另一条路(init(any)),看看这个Init an object conforming to Codable with a dictionary/array

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

如何获取SCNCamera正在查看的网格点(SCNNode)的局部坐标和局部法线?

如何写一个;风格;视图修饰符,它会影响特定类型的所有嵌套视图?

SwiftData:非法try 在不同上下文中的对象之间建立关系

如何使用模型在 SwiftUI 的列表中进行搜索

SwiftUI 中的同一个 ForEach 中是否可以有 2 个数组?

当字符串包含 \r\n 时,NSRegularExpression 不起作用

SwiftUI:当先前的视图列表更改时,NavigationView 详细视图会弹出回栈

如何将使用\u{ea12}创建的 Swift 字符串转换回其十六进制值/字符串ea12?

在 Swift 4 中实现自定义解码器

Alamofire 会自动存储 cookie 吗?

在运行时访问 UIView 宽度

在 UItextfield 的右视图上添加一个按钮,文本不应与按钮重叠

Swift - 导入我的 swift 类

是 swift 中另一个日期的同一周、月、年的日期

不能从非开放类继承 swift

两个 Date 对象之间的所有日期 (Swift)

使用相机进行人脸检测

Switch 语句中的字符串:String不符合协议IntervalType

对分段控制的快速处理动作