如何在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
相关产品推荐
相关产品推荐

