如何使自定义对象符合 Codable
How to conform a custom object to Codable
我一直在尝试保存一个 UserData 对象,以便内容是“永久的”。所有在线方法都显示 classes 具有原始类型,如 String、Int、Double 等。我知道你可以存储数据类型,但我找不到太多
这是我要保存到磁盘的class。它出错了:“类型'UserData'不符合协议'Decodable'”和“类型'UserData'不符合协议'Encodable'”
很明显,是 skillBag 导致了这个问题;但我找不到任何关于如何使 Skill 符合 Codable 的资源。
class UserData : ObservableObject, Codable{
private var userName:String;
@Published private var skillBag:[Skill] = [];
init(Username user:String, skillBag skills:[Skill]) {
userName = user;
skillBag = skills;
}
}
技能Class
class Skill : Identifiable, ObservableObject, Equatable{
@Published var skillName:String = "";
@Published var level:Int = 1;
@Published var prestiege:Int = 0;
var curXP:Double = 0.0;
var maxXP:Double = 50.0;
@Published var skillDesc:String;
@Published public var skillColor:Color = Color.purple;
@Published public var buttons: [SkillButton] = [];
@Published private var prestCap:Int;
//EXTRA HIDDEN CODE
}
作为参考,这里是技能按钮Class
class SkillButton : Identifiable, ObservableObject, Equatable{
@Published public var xp:Double = 0;
@Published private var buttonName:String = "";
@Published private var uses:Int = 0;
@Published public var buttonColor:Color = Color.pink;
@Published private var description:String;
enum CodingKeys: String, CodingKey {
case buttonName, xp, uses, buttonColor, description
}
init(ButtonName buttonName:String, XpGained xp:Double, Uses uses:Int = 0, Description desc:String = "") {
self.xp = xp;
self.buttonName = buttonName;
self.uses = uses;
self.description = desc;
}
}
我知道这些 class 中的每一个都需要符合 Codable,但我找不到使它们符合 Codable 的资源。
除了 Skill
和 SkillButton
类 不符合 Codable
之外,您遇到的根本问题是 @published
属性 包装器,因为这会停止 Codable 一致性的 auto-synthesis。
除了写出解决方案,我可以向您推荐这个 Hacking with Swift link: https://www.hackingwithswift.com/books/ios-swiftui/adding-codable-conformance-for-published-properties
您还必须自己使 Color
符合 Codable
,因为(除非它在最近的更新中发生了变化?)它不是 Codable
开箱即用的。
我一直在尝试保存一个 UserData 对象,以便内容是“永久的”。所有在线方法都显示 classes 具有原始类型,如 String、Int、Double 等。我知道你可以存储数据类型,但我找不到太多
这是我要保存到磁盘的class。它出错了:“类型'UserData'不符合协议'Decodable'”和“类型'UserData'不符合协议'Encodable'”
很明显,是 skillBag 导致了这个问题;但我找不到任何关于如何使 Skill 符合 Codable 的资源。
class UserData : ObservableObject, Codable{
private var userName:String;
@Published private var skillBag:[Skill] = [];
init(Username user:String, skillBag skills:[Skill]) {
userName = user;
skillBag = skills;
}
}
技能Class
class Skill : Identifiable, ObservableObject, Equatable{
@Published var skillName:String = "";
@Published var level:Int = 1;
@Published var prestiege:Int = 0;
var curXP:Double = 0.0;
var maxXP:Double = 50.0;
@Published var skillDesc:String;
@Published public var skillColor:Color = Color.purple;
@Published public var buttons: [SkillButton] = [];
@Published private var prestCap:Int;
//EXTRA HIDDEN CODE
}
作为参考,这里是技能按钮Class
class SkillButton : Identifiable, ObservableObject, Equatable{
@Published public var xp:Double = 0;
@Published private var buttonName:String = "";
@Published private var uses:Int = 0;
@Published public var buttonColor:Color = Color.pink;
@Published private var description:String;
enum CodingKeys: String, CodingKey {
case buttonName, xp, uses, buttonColor, description
}
init(ButtonName buttonName:String, XpGained xp:Double, Uses uses:Int = 0, Description desc:String = "") {
self.xp = xp;
self.buttonName = buttonName;
self.uses = uses;
self.description = desc;
}
}
我知道这些 class 中的每一个都需要符合 Codable,但我找不到使它们符合 Codable 的资源。
除了 Skill
和 SkillButton
类 不符合 Codable
之外,您遇到的根本问题是 @published
属性 包装器,因为这会停止 Codable 一致性的 auto-synthesis。
除了写出解决方案,我可以向您推荐这个 Hacking with Swift link: https://www.hackingwithswift.com/books/ios-swiftui/adding-codable-conformance-for-published-properties
您还必须自己使 Color
符合 Codable
,因为(除非它在最近的更新中发生了变化?)它不是 Codable
开箱即用的。