使用字典/数组初始化符合Codable的对象

Chr*_*ore 10 swift codable

主要是我的用例是使用字典创建对象:例如

struct Person: Codable { let name: String }    
let dictionary = ["name": "Bob"]
let person = Person(from: dictionary)    
Run Code Online (Sandbox Code Playgroud)

我想避免编写自定义实现,并希望尽可能高效.

Chr*_*ore 24

目前,我所拥有的最佳解决方案是此,但它具有编码/解码的开销.

extension Decodable {
  init(from: Any) throws {
    let data = try JSONSerialization.data(withJSONObject: from, options: .prettyPrinted)
    let decoder = JSONDecoder()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:sszzz"
    decoder.dateDecodingStrategy = .formatted(dateFormatter)
    self = try decoder.decode(Self.self, from: data)
  }
}
Run Code Online (Sandbox Code Playgroud)

根据问题中的例子,结果将是

let person = Person(from: dictionary)
Run Code Online (Sandbox Code Playgroud)

如果您对以其他方式感兴趣,那么这可能有助于/sf/answers/3243033881/

  • DateFormatter 部分是什么...? (3认同)