如何使自定义对象符合 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 的资源。

除了 SkillSkillButton 类 不符合 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 开箱即用的。