I am trying to store the dictionary in my class Marker but it is throwing an error saying it is not encodable or decodable. I can see the error is caused by the [String: Any
So finally worked it out with the help of Andrada.
I added a second struct which held the action and by passed having to use [string:any]
class Marker : Encodable, Decodable {
var UUIDpic: UUID = UUID()
var alpha: Int = 1
var buttonType: Int = 0
var buttonAction : [String: [ButtonAction]] = [:] //Dictionary I edited using the new struct
var buttonNameColor: String = ""
var buttonNameFontSize: Int = 10
var buttonShape: String = ""
var loggerRect: String = ""
var maskColor: String = ""
var name: String = ""
}
Below is the struct I added
struct ButtonAction: Codable {
var action: String
var array_linked_of_buttons: [[String:String]]
init(action: String, array_linked_of_buttons: [[String:String]]) {
self.action = action
self.array_linked_of_buttons = array_linked_of_buttons
}
}
Make sure to init your struct or it won't work.
Unfortunately you cannot use encode
or decode
on generic types containing Any
(e.g. [String: Any]
or [Any]
). Any
does not conform to protocols Encodable
nor Decodable
and Swift doesn't know how to encode/decode it. You must use a concrete generic type for your dictionary (e.g. [String: String]
).
If you still need to use a general type like Any
you have to implement encode(to:)
and init(from:)
methods. Another option would be to use a struct
instead of your [String: [String: [String:Any]]]
which conforms to Codable
(Encodable & Decodable
). You will still have to implement encode(to:)
and init(from:)
methods in that struct, but the bright side is that you will not have to write the encoder.encode()
story for all the properties like you would have to if you implement them in the Marker
class.