核心数据中可选的 Int32 值需要在代码中解包可选的 Int32 值
Optional Int32 values in Core Data require unwrapping of optional Int32 values in code
在 Core Data 中,String 和 Int32 类型的属性是 "Optional"(在属性中勾选)。
对应于代码中的这些值,与可选类型相同。
var color1: String?
var color2: String?
var color3: String?
var colorRangeLoc1: Int32?
var colorRangeLoc2: Int32?
var colorRangeLoc3: Int32?
在某些情况下会设置值,并作为可选值传递给函数,以便传输到 Core Data。
func loadCellData(text: String, sortOrder: Int32, portion: Float, color1: String?, color2: String?, color3: String?, colorRangeLoc1: Int32?, colorRangeLoc2: Int32?, colorRangeLoc3: Int32?, colorRangeLen1: Int32?, colorRangeLen2: Int32?, colorRangeLen3: Int32?, underlineRangeLoc1: Int32?, underlineRangeLoc2: Int32?, underlineRangeLoc3: Int32?, underlineRangeLen1: Int32?, underlineRangeLen2: Int32?, underlineRangeLen3: Int32?)
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entry: CellData = NSEntityDescription.insertNewObject(forEntityName: "CellData", into: context) as! CellData
entry.text = text
entry.sortOrder = sortOrder
entry.portion = portion
entry.color1 = color1
entry.color2 = color2
entry.color3 = color3
entry.colorRange1Loc = colorRangeLoc1
entry.colorRange2Loc = colorRangeLoc2
entry.colorRange3Loc = colorRangeLoc3
...
Xcode 编译字符串没有错误?值、color1、color2 和 color3,但显示 Int32 的以下错误?值:
这表明 CoreData 中的可选 Int32 需要一个未包装的可选值(而可选字符串很好)?有区别吗(这会帮助我理解为什么),如果有的话,如何最好地管理它?
将 'nil' 指定为起始值无效。如果为零(当然),强制展开会导致崩溃。是否需要检查 Int32 类型的所有值?
if colorRangeLoc1 != nil { entry.colorRangeLoc1 = colorRangeLoc1 }
或者应该是'guard'还是'if let'?
CoreData 中的可选值与 Swift 中的不同。根据评论,至少对于数字,设置一个强制性的 - 不可能的值 - 而不是零,并在使用该值时检查它。
public var parent: Int32? {
get {
willAccessValue(forKey: "parent")
defer { didAccessValue(forKey: "parent") }
return primitiveValue(forKey: "parent") as? Int32
}
set {
willChangeValue(forKey: "parent")
defer { didChangeValue(forKey: "parent") }
guard let value = newValue else {
setPrimitiveValue(nil, forKey: "parent")
return
}
setPrimitiveValue(value, forKey: "parent")
}
}
在 Core Data 中,String 和 Int32 类型的属性是 "Optional"(在属性中勾选)。
对应于代码中的这些值,与可选类型相同。
var color1: String?
var color2: String?
var color3: String?
var colorRangeLoc1: Int32?
var colorRangeLoc2: Int32?
var colorRangeLoc3: Int32?
在某些情况下会设置值,并作为可选值传递给函数,以便传输到 Core Data。
func loadCellData(text: String, sortOrder: Int32, portion: Float, color1: String?, color2: String?, color3: String?, colorRangeLoc1: Int32?, colorRangeLoc2: Int32?, colorRangeLoc3: Int32?, colorRangeLen1: Int32?, colorRangeLen2: Int32?, colorRangeLen3: Int32?, underlineRangeLoc1: Int32?, underlineRangeLoc2: Int32?, underlineRangeLoc3: Int32?, underlineRangeLen1: Int32?, underlineRangeLen2: Int32?, underlineRangeLen3: Int32?)
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entry: CellData = NSEntityDescription.insertNewObject(forEntityName: "CellData", into: context) as! CellData
entry.text = text
entry.sortOrder = sortOrder
entry.portion = portion
entry.color1 = color1
entry.color2 = color2
entry.color3 = color3
entry.colorRange1Loc = colorRangeLoc1
entry.colorRange2Loc = colorRangeLoc2
entry.colorRange3Loc = colorRangeLoc3
...
Xcode 编译字符串没有错误?值、color1、color2 和 color3,但显示 Int32 的以下错误?值:
这表明 CoreData 中的可选 Int32 需要一个未包装的可选值(而可选字符串很好)?有区别吗(这会帮助我理解为什么),如果有的话,如何最好地管理它?
将 'nil' 指定为起始值无效。如果为零(当然),强制展开会导致崩溃。是否需要检查 Int32 类型的所有值?
if colorRangeLoc1 != nil { entry.colorRangeLoc1 = colorRangeLoc1 }
或者应该是'guard'还是'if let'?
CoreData 中的可选值与 Swift 中的不同。根据评论,至少对于数字,设置一个强制性的 - 不可能的值 - 而不是零,并在使用该值时检查它。
public var parent: Int32? {
get {
willAccessValue(forKey: "parent")
defer { didAccessValue(forKey: "parent") }
return primitiveValue(forKey: "parent") as? Int32
}
set {
willChangeValue(forKey: "parent")
defer { didChangeValue(forKey: "parent") }
guard let value = newValue else {
setPrimitiveValue(nil, forKey: "parent")
return
}
setPrimitiveValue(value, forKey: "parent")
}
}