I have a class named Event that I want to make it Codable:
class Event: Codable {
let name: String
let action: String
let data: [String: Any]?
enum CodingKeys: String, CodingKey {
case name
case action
case data
}
init(name: String, action: String, data: [String: Any]?) {
self.name = name
self.action = action
self.data = data
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.name = try values.decode(String.self, forKey: .name)
self.action = try values.decode(String.self, forKey: .action)
let eventDataAsJSONString = try values.decode(String.self, forKey: .data)
if let eventDataAsData = eventDataAsJSONString.data(using: .utf8) {
self.data = try? JSONSerialization.jsonObject(with: eventDataAsData, options: []) as? [String: Any]
} else {
self.data = nil
}
}
func encode(from encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.name, forKey: .name)
try container.encode(self.action, forKey: .action)
if let data = self.data {
let eventDataAsData = try! JSONSerialization.data(withJSONObject: data, options: [])
let eventDataAsJSONString = String(data: eventDataAsData, encoding: .utf8)
try container.encode(eventDataAsJSONString, forKey: .data)
} else {
try container.encodeNil(forKey: .data)
}
}
}
but I'm getting this error:
Type 'Event' does not conform to protocol 'Encodable'
I implemented both init(from decoder: Decoder) and encode(from encoder: Encoder).
so what I'm doing wrong here?
Anytogether withCodable, that's what is wrong. What do you mean with "my users"? - Joakim DanielsonSomeFramework.shared.sendEvent(event: Event)that sends that event to a server as a JSON. I have a module that does the job(sending messages to the server) for me with codable objects. because of this reason I'm trying to make event codable. - Jafar Khoshtabiat