Core data 我的分段选取器有正常的Int值作为标记,这是如何传递给CoreData的?

Core data 我的分段选取器有正常的Int值作为标记,这是如何传递给CoreData的?,core-data,swiftui,swiftui-form,Core Data,Swiftui,Swiftui Form,我的SwiftUI分段控件选择器使用普通Int“.tag(1)”etc值进行选择 CoreData只有Int16、Int32和Int64选项可供选择,使用这些选项中的任何一个,我的选择器选择和CoreData似乎都拒绝相互交谈 请问这项(?简单??)任务是如何完成的 我尝试了CoreData中所有基于数字的选项,包括Int16-64、double和float,它们都破坏了我的代码,或者根本不起作用 Picker(selection: $addDogVM.gender, label: Text(&

我的SwiftUI分段控件选择器使用普通Int“.tag(1)”etc值进行选择

CoreData只有Int16、Int32和Int64选项可供选择,使用这些选项中的任何一个,我的选择器选择和CoreData似乎都拒绝相互交谈

请问这项(?简单??)任务是如何完成的

我尝试了CoreData中所有基于数字的选项,包括Int16-64、double和float,它们都破坏了我的代码,或者根本不起作用

Picker(selection: $addDogVM.gender, label: Text("Gender?")) {
    Text("Boy ♂").tag(1)
    Text("?").tag(2)
    Text("Girl ♀").tag(3)
}

我希望3个CoreData Int选项中的任何一个都能开箱即用,并与选择器使用的(标准)Int兼容。

分段控件的每个元素都由类型为
Int
的索引表示,因此该索引从
0
开始

因此,使用具有三个分段的分段控件示例(例如:Boy♂, ?, 姑娘♀), 每个段由三个索引0、1和2表示

如果用户选择表示女孩的分段控件♀, 然后

segmentedControl.selectedSegmentIndex = 2
因此,当使用核心数据框架存储一个值(即在UI中表示为分段控制索引)时,我总是从
0
开始

从这一点开始,你读到的所有东西都是程序员的偏好——这是很清楚的——有很多方法可以达到相同的结果,你应该选择一种最适合你和你的编码风格的方法。还要注意的是,这可能会让新手感到困惑,所以我鼓励耐心。我唯一的建议是,让事情尽可能简单在您进行了充分的测试、调试和测试以理解差异之前,这是可能的

因此,继续:

这些国家

…在64位平台上,Int与Int64的大小相同

因此,在核心数据模型编辑器(
.xcdatamodeld
文件)中,我选择对代码中用作
Int
的任何值应用
Integer 64
属性类型

另外,在不久前的某个地方,我读到,如果没有理由使用
Integer 16
Integer 32
,那么在对象模型图中默认使用
Integer 64
(我假设
Integer 16
Integer 32
是为了向后兼容而保留的)。如果我找到了该引用,我将把它链接到这里

我可以在这里介绍标量属性类型的使用,并通过在属性检查器类Codegen=Manual/None中选择来手动编写托管对象子类,但老实说,我认为这样添加的细节只会使事情变得复杂

因此,“由核心数据自动生成”托管对象子类(
NSManagedObject
)将使用可选的
NSNumber?
包装器

因此,您需要在代码中转换持久化/保存的数据

我在两个地方做这件事…当我访问数据和保存数据时

(注意,我假设您的实体类型为
Dog
,并且存在
Dog
的实例,即
let Dog=Dog()

在这两者之间,我使用类型为
Int
的“temp”
var
属性来处理分段控件

// temporary property to use with segmented control
private var tempGender: Int?

更新 我现在做最后一部分有点不同

我没有在代码中转换数据,而是对托管对象子类进行了一个简单的扩展来执行转换

extension Dog {
    var genderAsInt: Int {
        get {
            guard let gender = self.gender else { return 0 }
            return Int(truncating: gender)
        }
        set {
            self.gender = NSNumber(value: newValue)
        }
    }
} 
你的选择器代码

Picker(selection: $addDogVM.genderAsInt, label: Text("Gender?")) {
    Text("Boy ♂").tag(0)
    Text("?").tag(1)
    Text("Girl ♀").tag(2)
}
任何问题,请在评论中提问

Picker(selection: $addDogVM.genderAsInt, label: Text("Gender?")) {
    Text("Boy ♂").tag(0)
    Text("?").tag(1)
    Text("Girl ♀").tag(2)
}