I'm completely lost in encoding classes to Dictionary
I have for instance the following class
class AdjectifsModel: BaseModel {
var id: Int = 0
var idmot: Int = 0
var idtypemot: Int = 0
var idracine: Int = 0
var racine: String = ""
var francais: String = ""
var msingulier: String = ""
var fsingulier: String = ""
var mpluriel: String = ""
var fpluriel: String = ""
var commentaire: String = ""
var erreur: Int = 0
var nbliens: Int = 0
enum CodingKeys: String, CodingKey {
case id
case idmot
case idtypemot
case idracine
case racine
case francais
case msingulier
case fsingulier
case mpluriel
case fpluriel
case commentaire
case erreur
case nbliens
}
}No problem to encode it with the following code:
required convenience init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.init()
self.id = try container.decoder(Int.self, forKey: .id)
self.idmot = try container.decoder(Int.self, forKey: .idmot)
self.idtypemot = try container.decoder(Int.self, forKey: .idtypemot)
self.idracine = try container.decoder(Int.self, forKey: .idracine)
self.racine = try container.decoder(String.self, forKey: .racine)
self.francais = try container.decoder(String.self, forKey: .francais)
self.msingulier = try container.decoder(String.self, forKey: .msingulier)
self.fsingulier = try container.decoder(String.self, forKey: .fsingulier)
self.mpluriel = try container.decoder(String.self, forKey: .mpluriel)
self.fpluriel = try container.decoder(String.self, forKey: .fpluriel)
self.commentaire = try container.decoder(String.self, forKey: .commentaire)
self.erreur = try container.decoder(Int.self, forKey: .erreur, defaut: 0)
self.nbliens = try container.decoder(Int.self, forKey: .nbliens, defaut: 0)
}But in order to save my class, I need to transform it in a Dictionary [String: String] and I don't kown how to do it
I found on the internet the following code:
class DictionaryEncoder {
private let encoder = JSONEncoder()
var dateEncodingStrategy: JSONEncoder.DateEncodingStrategy {
set { encoder.dateEncodingStrategy = newValue }
get { return encoder.dateEncodingStrategy }
}
var dataEncodingStrategy: JSONEncoder.DataEncodingStrategy {
set { encoder.dataEncodingStrategy = newValue }
get { return encoder.dataEncodingStrategy }
}
var nonConformingFloatEncodingStrategy: JSONEncoder.NonConformingFloatEncodingStrategy {
set { encoder.nonConformingFloatEncodingStrategy = newValue }
get { return encoder.nonConformingFloatEncodingStrategy }
}
var keyEncodingStrategy: JSONEncoder.KeyEncodingStrategy {
set { encoder.keyEncodingStrategy = newValue }
get { return encoder.keyEncodingStrategy }
}
func encode(_ value: T) throws -> [String: Any] where T : Encodable {
let data = try encoder.encode(value)
return try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]
}
}I copy it (and I must admit that I don't undestand how it works).
If my class contains only strings property, the following Code works:
var params = try DictionaryEncoder().encode(self)but if the properties are mixed (Strings and Int) it doesn't work