tutorial objective how español datos data ios swift subclass nsmanagedobject

ios - objective - Swift+CoreData: no se puede establecer automáticamente el atributo opcional en la subclase NSManagedObject generada



swift, base de datos, (2)

Tengo una entidad de coredata llamada Record y tiene una propiedad dateUpdated. Noté que la subclase NSManagedObject generada no tiene marca opcional (?)

Editor de CoreData:

Subclase generada:

Esperado:

ACTUALIZADO: Es tedioso por mi parte, porque cada vez que quiero regenerar las subclases, significa que también necesito actualizar todos los valores opcionales manualmente. Tener una subclase no opcional (sin ''?'') Me lleva a verificar evalue antes de asignar, como en el siguiente ejemplo:

// sample value: // serverDateFormatter = "yyyy/MM/dd" // dateString = "" // Branch is a subclass of Record (see above images) var date = self.coreData.serverDateFormatter.dateFromString(dateString) if date != nil { branch.dateUpdated = date }

Pero si xcode puede establecer automáticamente el valor opcional en la subclase con (?) Solo tengo que hacer esto:

branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)

En mi caso, tengo un montón de propiedades que debo marcar como opcional de forma manual.


Solución:

Sí, esto parece un error / limitación. Use tipos no escalares para solucionar este problema.

Atributos opcionales

  • Marque la casilla de verificación opcional
  • Desmarque la casilla de verificación escalar

Atributos no opcionales

  • Desmarque la casilla de verificación opcional
  • Casilla de verificación escalar

Razón probable:

El código Swift se traduce a Objective-C y Objective-C no admite valores nil para tipos que no son de clase.


La casilla de verificación opcional en el Core Data Model Editor ha existido antes de que se introdujeran Swift y sus opcionales. Apple lo menciona en su Guía de programación de datos básicos :

Puede especificar que un atributo sea opcional, es decir, no es necesario que tenga un valor. En general, sin embargo, no se recomienda hacerlo, especialmente para los valores numéricos (normalmente puede obtener mejores resultados utilizando un atributo obligatorio con un valor predeterminado, en el modelo, de 0). La razón de esto es que SQL tiene un comportamiento de comparación especial para NULL que es diferente de Objective-C nil. NULL en una base de datos no es lo mismo que 0, y las búsquedas de 0 no coincidirán con las columnas con NULL.

Por lo tanto, usando Swift y Xcode 8, la casilla de verificación opcional está (todavía) no relacionada con el hecho de que usted definió sus propiedades como opcionales o no en sus subclases de objeto gestionado. Y no espere que la casilla de verificación opcional tenga un impacto en el tipo opcional de propiedades de las subclases NSManagedObject cuando las crea utilizando Editor > Crear subclase NSManagedObject .

Dicho esto, cada vez que necesito una propiedad para tener su casilla de verificación opcional seleccionada en el Editor de Modelos, pongo inmediatamente su declaración de Subclase NSManagedObject como opcional.

Apéndice

Mogenerator puede alternar automáticamente las propiedades de la subclase NSManagedObject entre no opcional y opcional cada vez que cambie esta opción para cada atributo de su Entidad en el Inspector de modelo de datos y reconstruya su proyecto.