¿Cómo representar escalares opcionales de Datos de Núcleo (Bool / Int / Double / Float) en Swift?

(primero notado en: Xcode 8.2.1, iOS 10, Swift 3) (todavía presente a partir de: Xcode 9 beta 3, iOS11, Swift 4)

Todos sabemos que el concepto de Core Data de los optionals precede y no está estrictamente vinculado al concepto Swift de optionals .

Y hemos aceptado que incluso si un atributo de Core Data está marcado como Non-optional , la subclass NSManagedObject generada NSManagedObject tiene un tipo optional :

(algunas personas eliminan manualmente la ? sin efectos adversos, otras no, pero eso no viene al caso)

(A partir de aquí, el ejemplo y las capturas de pantalla son para las properties de Bool , pero lo mismo para Int16/32/64 , Double , Float )

Ahora me di count de lo contrario: cuando un atributo Core Data de tipo Bool está marcado como Optional (y se elige Use Scalar Type , que Xcode hace de forma pnetworkingeterminada), la class generada automáticamente tiene una variable de tipo non-optional .

¿Esto tiene sentido? ¿Es un error? ¿El comportamiento está documentado en cualquier parte?

Y lo más importante: ¿cómo represento realmente un Bool opcional?

Se me ocurren algunas soluciones, pero no parecen ideales (por ejemplo, no usar escalares, sino volver a NSNumber representación de Bool . O (peor aún) tener un Bool separado llamado algo como isVerified_isSet )


Nota: hice un par de testings más y si el Default Value se establece en None o NO , la variable se guarda como false (incluso si nunca la asigno en mi código). Si el Default Value se establece en YES , la variable se guarda como true . Sin embargo, esto significa que (aparentemente) no hay forma de representar lógicamente esta variable como que aún no se ha establecido.

Veo lo mismo, y considero que es un error. No está documentado en ninguna parte que pueda encontrar. Al parecer Core Data está aplicando supuestos de estilo Objective-C aquí, donde un boolean tiene como valor pnetworkingeterminado NO , y un número integer pnetworkingeterminado es 0. La interfaz Core Data / Swift tiene algunas asperezas, y esta es una que no había considerado antes.

Es un buen hallazgo, pero creo que estás estancado hasta que Apple lo dirija. Ya sabes las mejores soluciones, que estoy de acuerdo no son geniales. Recomiendo archivar un error.

Esto sucede porque los types escalares de Objective-C no tienen una noción de valor nulo. Fuente: handling-core-data-optional-scalar-attributes