¿Verificar si la propiedad está configurada en Datos básicos?

¿Cómo puedo verificar si una propiedad está configurada en un Objeto de Datos Básicos?

Cargué todos mis objetos de datos principales en un directorio:

var formQuestions = [Questions]() 

Y mi Core Data NSManagementObject es:

 @NSManaged var noticeText: String 

formQuestions [indexPath.row] .noticeText

// cargar con:

 var fetchRequest = NSFetchRequest(entityName: "Questions") fetchRequest.predicate = NSPredicate(format: "forms = %@", currentForm!) formQuestions = context.executeFetchRequest(fetchRequest, error: nil) as [Questions] 

Mi propiedad “noticeText” puede estar vacía o no, así que cuando creo mi Objeto de Datos Core algunos valores no pueden ser configurados. (La propiedad está configurada como opcional en Core Data)

Cuando bash probar si hay un valor, siempre me da un “EXC_BAD_ACCESS …”

 if(formQuestions[indexPath.row].noticeText.isEmpty == false) 

Podría establecer un String vacío cuando creo mi Objeto de Datos Básicos, pero esa no debería ser una buena solución.

Entonces, ¿cómo puedo verificar si existe un valor (optinal) y no establecido?

Gracias por adelantado.

Actualización para Xcode 7: este problema se ha resuelto con Xcode 7 beta 2. Las propiedades de datos centrales opcionales ahora se definen como propiedades opcionales en las subclases de objetos administrados generados por Xcode. Ya no es necesario editar la definición de clase generada.


(Respuesta anterior 🙂

Al crear las subclases NSManagedObject , Xcode no define las propiedades opcionales para esos atributos que están marcados como “opcionales” en el inspector del modelo de Datos Core. Esto parece un error para mí.

Como solución alternativa, puede convertir la propiedad en una opción ( as String? en su caso) y luego probarla con un enlace opcional.

 if let notice = someManagedObject.noticeText as String? { println(notice) } else { // property not set } 

En tu caso, eso sería

 if let notice = formQuestions[indexPath.row].noticeText as String? { println(notice) } else { // property not set } 

Actualización: A partir de Xcode 6.2, esta solución ya no funciona y se bloquea con una excepción EXC_BAD_ACCESS de tiempo de ejecución (comparar Swift: detectar un valor nulo inesperado en un tiempo de ejecución no opcional: la conversión como opcional falla )

La solución “Respuesta anterior” a continuación todavía funciona.


(Respuesta anterior 🙂

Como @Daij-Djan ya indicó en un comentario, debe definir la propiedad para un atributo opcional de Datos centrales como opcional opcional o implícitamente desenvuelto :

 @NSManaged var noticeText: String? // optional @NSManaged var noticeText: String! // implicitly unwrapped optional 

Desafortunadamente, Xcode no define las propiedades opcionales correctamente al crear las subclases NSManagedObject, lo que significa que debe volver a aplicar los cambios si crea las subclases nuevamente después de un cambio de modelo.

También esto parece estar aún sin documentar, pero ambas variantes funcionaron en mi caso de prueba.

Puede probar la propiedad con == nil :

 if formQuestions[indexPath.row].noticeText == nil { // property not set } 

o con una tarea opcional:

 if let notice = formQuestions[indexPath.row].noticeText { println(notice) } else { // property not set } 

Su aplicación está fallando porque intenta acceder a una not optional variable que es nula . Esto no está permitido a toda velocidad. Para solucionar su problema simplemente agregue la subclase NSManagedObject a ? para hacer la propiedad opcional:

 @objc class MyModel: NSManagedObject { @NSManaged var noticeText: String? // <-- add ? here } 

Luego, para probar la propiedad, puede hacer esto:

 if let aNoticeText = formQuestions[indexPath.row].noticeText? { // do something with noticeText }