2014-09-04 12 views
11

come posso controllare se una proprietà è impostata in un oggetto dati core?Verificare se la proprietà è impostata in Dati principali?

a caricare tutti i miei oggetti principali dati in un repertorio:

var formQuestions = [Questions]() 

E il mio Core Data NSManagementObject è:

@NSManaged var noticeText: String 

formQuestions [indexPath.row] .noticeText

// caricare con:

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

La mia proprietà "noticeText" potrebbe essere vuota o no, quindi quando creo il mio oggetto Core Data alcuni valori potrebbero non essere impostati. (La struttura si trova come optional in Core Data)

Quando ho ora provo a proove se c'è un valore, mi porta sempre un "EXC_BAD_ACCESS ...."

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

ho potuto impostare un stringa vuota quando creo il mio oggetto dati core, ma non dovrebbe essere una buona soluzione.

Quindi, come posso verificare se esiste un valore (opticale) e non impostato?

Grazie in anticipo.

+0

'@NSManaged var noticeText: STRING' - non è opzionale - rendilo opzionale con! o ? a seconda di cosa vuoi –

+1

Oh colpa mia. Ma l'ho fatto con Editor-> CreateNSManagedSublcass e non c'è? quando uso "Opzionale" - ma non è un problema mio - non so ancora come controllare se la proprietà è impostata o meno. – derdida

risposta

29

Aggiornamento per Xcode 7: Questo problema è stato risolto con Xcode 7 beta 2. proprietà opzionale Core Data sono ora definiti come proprietà facoltative nelle sottoclassi oggetto gestito generati da Xcode. Non è più necessario per modificare la definizione della classe generata.


(Risposta precedente :)

Quando si creano le NSManagedObject sottoclassi, Xcode non definire le proprietà opzionali per quegli attributi che sono contrassegnati come "optional" nel modello di ispettore Core Data. Questo mi sembra un insetto.

Per risolvere il problema, si può lanciare la proprietà a un optional (as String? nel tuo caso) e poi prova con optional vincolante

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

Nel tuo caso, che sarebbe

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

Aggiornamento: A partire da Xcode 6.2, questa soluzione non funziona più e si blocca con un'eccezione di runtime EXC_BAD_ACCESS (confronto e Swift: detecting an unexpected nil value in a non-optional at runtime: casting as optional fails)

La soluzione "Vecchia risposta" di seguito funziona ancora.


(Old risposta :)

Come @ Daij-Djan già detto in un commento, è necessario definire la proprietà di un attributo Core Data optional come opzionale o implicitamente da scartare opzionale:

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

Purtroppo, Xcode non definisce le proprietà facoltative cor correttamente quando si creano le sottoclassi NSManagedObject , il che significa che è necessario riapplicare le modifiche se si creano nuovamente le sottoclassi dopo una modifica del modello.

Anche questo sembra essere ancora non documentato, ma entrambe le varianti hanno funzionato nel mio caso di test.

È possibile verificare la proprietà con == nil:

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

o con un incarico optional:

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

Qual è la differenza tra String e String! in questo caso? Perché è necessario scartarlo implicitamente? Perché non lasciarlo come stringa? – cfischer

+1

@cfisher: una stringa non può essere nulla. - Ma consiglierei di presentare una segnalazione di bug a Apple. Xcode dovrebbe generare il codice corretto per le proprietà opzionali. –

+0

Se il downright potrebbe lasciare un commento esplicativo? Sarei davvero interessato se qualcosa è sbagliato qui, e fissare la risposta, se necessario. –

5

L'applicazione si blocca perché si tenta di accedere a un not optional variable che è pari a zero . Questo non è permesso in rapido. Per risolvere il problema è sufficiente aggiungere nella NSManagedObject sottoclasse un ? al fatto la proprietà facoltativa:

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

Quindi per testare la proprietà che si può fare in questo modo:

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