如何将符合 Codable 协议的对象数组转换为 Dictionary 数组?

How can I convert an array of objects that conform Codable protocol to an array of Dictionary?

我有一个像这样的结构:

struct Demo: Codable {
    var foo: String
    var bar: String
    ...
}

我有一组演示:

let array = [Demo(foo: "a", bar: "b"), Demo(foo: "c", bar: "d")]

我想将此数组转换为字典 [[String: Any]],内容如下:

let dictionary:[[String : Any]] = array.toDictionaryFromArrayOfCodable()

我怎样才能得到它?

编辑: 我的预期输出是这样的,我想使用 JSONEncoder:

[["foo": "a", "bar": "b"], ["foo": "c", "bar": "d"]]

我找到了一个使用两个扩展的解决方案: - 首先从对象中获取字典 - 其次,用数组的每个元素创建一个字典数组,使用第一个扩展:

用法:

let dictionary = [Demo].asDictionaryFromArray()
print(dictionary)

按预期输出: [["bar":b,"foo":a],["bar":d,"foo":c]]

extension Encodable {

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

}

extension Array where Element: Encodable {

    func asDictionaryFromArray() -> [[String: Any]] {
        var dict = [[String: Any]]()

        _ = self.map {
            if let objectDict = [=11=].dictionaryFromObject {
                dict.append(objectDict)
            }
        }

        return dict
    }

}