如何使用 SwiftData 保存自定义枚举?

ale*_*ner 17 swift swift-data swiftui

我想将自定义枚举保存到我的SwiftData模型中。我可以让它工作,它显示甚至更新 UI 中的值。不过,重新启动应用程序时,枚举变量/实体的更改 \xe2\x80\x99t 仍然存在!

\n

使用自定义枚举时需要注意什么有什么建议吗?

\n

我的模特

\n
enum Type: Int, Codable {\n    case foo = 0\n    case bar = 1\n}\n\n@Model\nfinal public class Item {\n    var type: Type\n}\n
Run Code Online (Sandbox Code Playgroud)\n

用户界面代码

\n
struct DetailView: View {\n    @Bindable var item: Item\n    \n    // MARK: -\n    var body: some View {\n        Picker("Type", selection: $item.type) {\n            Text("Foo").tag(Type.foo)\n            Text("Bar").tag(Type.bar)\n        }\n        .pickerStyle(.segmented)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 10

该问题自 iOS 版本 17 beta 7 以来已得到修复。现在下面的代码可以正常工作。发行说明

enum ItemType: Int, Codable {
    case foo = 0
    case bar = 1
}

@Model
final public class Item {
    
    var type: ItemType
    
    init(type: ItemType) {
        self.type = type
    }
    
}

struct DetailView: View {
    
    @Bindable var item: Item
    
    var body: some View {
        Picker("Type", selection: $item.type) {
            Text("Foo").tag(ItemType.foo)
            Text("Bar").tag(ItemType.bar)
        }
        .pickerStyle(.segmented)
    }
    
}
Run Code Online (Sandbox Code Playgroud)


小智 7

这个解决方案对我有用。希望枚举能够在 SwiftData 的未来版本中得到修复。

enum SomeType: Int, Codable {
    case foo = 0
    case bar = 1
}

@Model
final public class Item {
    
    @Transient var type: SomeType {
        get { SomeType(rawValue: _type)! }
        set { _type = newValue.rawValue }
    }
    
    @Attribute var _type: SomeType.RawValue
    
} 
Run Code Online (Sandbox Code Playgroud)