1. ホーム
  2. swift

[解決済み] SwiftのCodableを使って、辞書にエンコードするには?

2022-05-11 11:58:11

質問

Swift 4の構造体である Codable . その構造体を辞書にエンコードするための簡単な組み込みの方法はありますか?

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 に準拠し Codable または本当に Encodable であれば、こうすればいいのです。

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

逆の場合は( init(any) ) にしたい場合は、次のものを見てください。 Codableに準拠したオブジェクトを辞書/配列で初期化する