swiftxcodecore-dataforced-unwrapping

Swift core data: why do I need to unwrap when setting optional attribute values?


I have a core data model that contains mainly optional attributes. I assumed then that I would not need to unwrap the values that I am assigning to these optional attributes. e.g. I thought I would be able to do:

myEntity.gravity = currentOrder.gravity

(myEntity.gravity being optional)

However, Swift still requires me to unwrap currentOrder.gravity. I would have thought given that the variable I am assigning to is optional that I would not need to unwrap this.

Update:

Here is the definition of one of the core data entities I am describing:

    <attribute name="percentComplete" optional="YES" attributeType="Float" defaultValueString="0.0" usesScalarValueType="YES"/>

The entity itself:

    <entity name="AircraftMeasurementsCD" representedClassName="AircraftMeasurementsCD" syncable="YES" codeGenerationType="class">

Solution

  • It seems you're equivocating on the word "optional". The word "optional" in the attribute description optional="YES" is not the same as, and has nothing to do with, the Swift Optional enum type.

    The former is merely the ordinary English word "optional", meaning "not required" — for a particular entity, there might or might not be a value for this attribute, which is a Float, but even if there isn't, it's a valid entity. Nothing in the story says that this attribute's type is Optional<Float>. Its type is Float. And you can't assign a Swift Optional where its wrapped type is expected; you have to unwrap it.

    Indeed, this point is made very explicitly by the documentation:

    Optional attributes aren’t required to have a value when saved to the persistent store. Attributes are optional by default. Core Data optionals aren’t the same as Swift optionals. [My italics.]