核心数据中可选的 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")
    }
}