You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Swift中使用@AppStorage存储自定义Codable类?

解决@AppStorage存储自定义Codable类的编译错误

@AppStorage默认仅支持实现RawRepresentable协议且原始类型为String/Int/Double/Bool等基础类型的对象,你的TestClass虽然实现了Codable,但未满足RawRepresentable要求,因此触发初始化器匹配失败的报错。

只需给TestClass扩展RawRepresentable协议,通过JSON编解码将类转换为Base64字符串作为存储载体即可解决:

完整代码实现

class TestClass: Codable {
    var testBool: Bool = true
}

// 扩展RawRepresentable协议,实现类与Base64字符串的互转
extension TestClass: RawRepresentable {
    public typealias RawValue = String
    
    public init?(rawValue: RawValue) {
        guard let data = Data(base64Encoded: rawValue),
              let decoded = try? JSONDecoder().decode(TestClass.self, from: data) else {
            return nil
        }
        self = decoded
    }
    
    public var rawValue: RawValue {
        guard let data = try? JSONEncoder().encode(self) else {
            return ""
        }
        return data.base64EncodedString()
    }
}

// 视图中即可正常使用@AppStorage
struct ContentView: View {
    var testClass1: TestClass = TestClass()
    @AppStorage("testClass2") var testClass2: TestClass = TestClass()
    
    var body: some View {
        Text(testClass2.testBool ? "当前值:True" : "当前值:False")
    }
}

说明

  • 存储时:TestClass实例会被JSON编码器转为Data,再编码为Base64字符串存入UserDefaults(@AppStorage的底层存储)。
  • 读取时:从UserDefaults取出Base64字符串,解码为Data后再通过JSON解码器转回TestClass实例。

内容的提问来源于stack exchange,提问作者HalifaxNick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:47:08