SwiftData持久化OptionSet遇异常:重启后值重置为0求解答
问题原因及解决方案
原因
在iOS 17/Xcode 15的初始版本中,SwiftData对嵌套在@Model类内部的自定义OptionSet类型(即便遵循Codable)的持久化支持存在缺陷:
- SwiftData默认无法自动识别并利用嵌套OptionSet的Codable实现完成序列化/反序列化
- 存储时未正确写入rawValue数据,重启App读取时只能初始化默认的
rawValue: 0
解决方案
有两种可行的修复方式:
方式一:添加@Attribute(.transformable)标记
给options属性添加该标记,明确告知SwiftData通过Codable来处理该类型的持久化:
@Model final class Item { @Attribute(.transformable) var options: SomeOptions struct SomeOptions: OptionSet, Codable { let rawValue: Int } init(options: SomeOptions = .init(rawValue: .random(in: 0..<10))) { self.options = options } }
方式二:将OptionSet移至@Model类外部
把SomeOptions结构体移出Item类,让SwiftData能正确识别其Codable实现:
struct SomeOptions: OptionSet, Codable { let rawValue: Int } @Model final class Item { var options: SomeOptions init(options: SomeOptions = .init(rawValue: .random(in: 0..<10))) { self.options = options } }
两种方式都能解决重启后rawValue变为0的问题。
内容的提问来源于stack exchange,提问作者parapote
相关产品推荐
相关产品推荐

