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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:12:52