Преобразование Codable / Encodable в JSON объект Swift - PullRequest
0 голосов
/ 22 октября 2018

Недавно я включил Codable в проект и для получения объекта JSON из типа, соответствующего Encodable я придумал это расширение,

extension Encodable {

    /// Converting object to postable JSON
    func toJSON(_ encoder: JSONEncoder = JSONEncoder()) -> [String: Any] {
        guard let data = try? encoder.encode(self) else { return [:] }
        guard let object = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) else { return [:] }
        guard let json = object as? [String: Any] else { return [:] }
        return json
    }
}

Это работает хорошо, но можетбыть ли лучший способ достичь того же?Я чувствую, что могут возникнуть проблемы с производительностью, когда частые вызовы jsonObject(with: для объекта с большим data.

1 Ответ

0 голосов
/ 22 октября 2018

Я предлагаю назвать функцию toDictionary и передать возможные ошибки вызывающей стороне.Условный сбой при понижении (несоответствие типов) генерируется с ошибкой кодирования typeMismatch de .

extension Encodable {

    /// Converting object to postable dictionary
    func toDictionary(_ encoder: JSONEncoder = JSONEncoder()) throws -> [String: Any] {
        let data = try encoder.encode(self)
        let object = try JSONSerialization.jsonObject(with: data)
        guard let json = object as? [String: Any] else {
            let context = DecodingError.Context(codingPath: [], debugDescription: "Deserialized object is not a dictionary")
            throw DecodingError.typeMismatch(type(of: object), context)
        }
        return json
    }
}
...