Swift + CoreData: No se puede establecer una subclass Bool en NSManagedObject – ¿Error?

Tengo un problema extraño que no puedo resolver, tengo una entidad simple con una subclass NSManagedObject personalizada:

@objc(EntityTest) class EntityTest: NSManagedObject { @NSManaged var crDate: NSDate @NSManaged var name: String @NSManaged var completed: Bool @NSManaged var completedOn: NSDate } 

Este es el problema, puedo crear el object bien y establecer todos los valores y almacenarlos en una matriz. Sin embargo, tarde, cuando bash recuperar el mismo object, puedo establecer todos los valores, EXCEPTO el campo "completado". Aparece un error de time de ejecución que dice "EXC_BAD_ACCESS", puedo leer el valor, simplemente no puedo configurarlo.

El depurador apunta a:

 0x32d40ae: je 0x32d4110 ; objc_msgSend + 108 0x32d40b0: movl (%eax), %edx 

Tal vez algunos problemas debido a que se trata como una class Objective-C y tratando de enviar un post para configurar booleans que sé que es un poco gracioso, ya que CoreData los representa originalmente como NSNumbers.

¿Algunas ideas? Yo mismo he creado la class, no está generada.

EDITAR:

 entity.crDate = NSDate() // succeeds entity.completed = false // fails entity.completed.setValue(false, forKey: "completed") //succeeds 

Por lo tanto, para configurar el bool, usar el setValue de NSManagedObject funciona, pero no los establecedores directos, aunque para las properties no bool, puedo configurarlo usando los setters.

ACTUALIZAR:

Al comprobar esto un poco más, parece ser la primera vez que configuro el valor después de get de NSEntityDescription, utiliza methods Swift Accessor normales. Más tarde, cuando bash acceder al mismo object (que se almacenó en una matriz), trata de tratarlo como un object de estilo Objective-C y envía un post para el método denominado "setCompleted". Creo que tiene sentido ya que uso la notación de punto para acceder a ella y utilicé la directiva @objc.

Lo probé creando un método "setCompleted", pero en el método establecí el valor usando "completed = newValue" que hace que una llamada recursiva regrese a "setCompleted" haciendo que se bloquee … Extraño, por lo que en este momento todavía puede No tengo una solución adecuada. Parece que solo sucede con Bools.

Solo la solución alternativa es utilizar el método "setValueForKey" de NSManagedObject. Tal vez file esto como un informe de error?

Si deja que Xcode 6 Beta 3 cree los files Swift para sus entidades, creará NSNumber properties CoreData para Boolean tipo Boolean de CoreData .

introduzca la descripción de la imagen aquí

Sin embargo, puede usar Bool como un tipo Swift en lugar de NSNumber, que funcionó para mí sin usar la syntax de puntos . Configurará Swift Bool con un NSNumber , que tal vez conduzca a un error en la syntax de puntos.


Para que sea explícito, debe usar el tipo NSNumber para attributes en la entidad con el tipo Boolean . Luego, cree una propiedad computada (en el lenguaje de progtwigción iBook The Swift en Guía de idiomas -> Propiedades -> Propiedades calculadas) para devolverle un Swift Bool . Por lo tanto, nunca realmente almacenaría un Bool .

Al igual que:

 @NSManaged var snack: NSNumber var isSnack: Bool { get { return Bool(snack) } set { snack = NSNumber(bool: newValue) } } 

Por supuesto, sería genial ocultar el otro (atributo NSNumber), pero sea paciente y Apple implementará attributes privados en el futuro.


Editar:

Si marca la casilla crear types de skalar , ¡incluso utilizará el tipo Bool en el file Swift creado automáticamente!

Entonces, creo que es un error.

Siguiendo de CH Buckingham, que es del todo correcto. Está intentando almacenar un tipo primitivo en datos centrales donde espera un NSNumber.

El uso correcto sería entity.completed = NSNumber.numberWithBool(false)

Esta es también la razón por la que no puede recuperar este valor completo como un bool directamente y, por lo tanto, debería escribir:

 var: Bool? = entity.completed.boolValue() 

Puede abatir su propiedad desde NSNumber a tipo Bool como este:

 var someBoolVariable = numberValue as Bool 

Me funciona de esta manera:

 self.twoFactorAuthEnabledSwitch.enabled = userProfile?.twoFactorEnabled as Bool 

En XCode 8 Acaba de establecer:

 user.isLoggedIn = true 

funciona como un encanto

No he tocado rápido, pero en Objective-C, un BOOL no es un object y no puede ser un object. Es primitivo, y parece que está intentando decirle a una class Objective-C que trate a un BOOL como un object. Pero podría estar inventando eso, ya que no estoy familiarizado con lo que hace @NSManaged debajo del capó.

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html

Descubrí que funciona bien si especifica el nombre de la class y el module en el model de datos (en lugar de dejar el NSManagedObject pnetworkingeterminado).

Una vez que establezco eso, puedo usar Bool , Int16 , Int32 , etc., sin ningún problema.