Swift-将字典[String:Any]编码和解码为plist



我正试图将字典存储在我的类Marker中,但它抛出了一个错误,说它不可编码或解码。我可以看出错误是由[String:Any]引起的,但我该如何绕过它?

var buttonActions : [String: [String: [String:Any]]] = [:]

保存并加载

func saveData() {
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("(fileName).plist")
let encoder = PropertyListEncoder()
do {
let data = try encoder.encode(markerArray)
try data.write(to: dataFilePath!)
print("Saved")
} catch {
print("Error Encoding (error)")
}
}
func loadData() {
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("(fileName).plist")
if let data = try? Data(contentsOf: dataFilePath!){
let decoder = PropertyListDecoder()
do {
markerArray = try decoder.decode([Marker].self, from: data)
} catch {
print("Decode Error (error)")
}
}

class Marker : Encodable, Decodable {
var UUIDpic: UUID = UUID()
var alpha: Int = 1
var buttonType: Int = 0
var buttonActions : [String: [String: [String:Any]]] = [:]
var buttonNameColor: String = ""
var buttonNameFontSize: Int = 10
var buttonShape: String = ""
var loggerRect: String = ""
var maskColor: String = ""
var name: String = ""
}

很遗憾,不能在包含Any的泛型类型(例如[String: Any][Any](上使用encodedecodeAny不符合协议EncodableDecodable,Swift不知道如何对其进行编码/解码。您必须为字典使用具体的泛型类型(例如[String: String](。

如果仍然需要使用像Any这样的通用类型,则必须实现encode(to:)init(from:)方法。另一种选择是使用struct而不是符合Codable(Encodable & Decodable(的[String: [String: [String:Any]]]。您仍然需要在该结构中实现encode(to:)init(from:)方法,但好的一面是,您不必像在Marker类中实现它们那样为所有属性编写encoder.encode()故事。

所以在安德拉达的帮助下终于解决了。

我添加了第二个结构,它保存了操作,并通过传递必须使用[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 = ""
}

下面是我添加的结构

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
}
}

请确保初始化您的结构,否则它将不起作用。

最新更新