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