2015-02-20 14 views
7

che sto cercando di utilizzare NSPredicate a Swift per interrogare Core Data, ma getta un'EXC_BAD_ACCESS (Codice = 1, indirizzo = 0x1) di errore quando si tenta di eseguire cosa sto facendo di sbagliato?Swift NSPredicate gettando EXC_BAD_ACCESS (Codice = 1, indirizzo = 0x1) quando compounding dichiarazioni

Ecco il file in cui l'errore si verifica

class LevelsScreenModel : UIViewController { 

func getWord(level: Int, section: Int) -> String 
{ 
    let fetchRequest = NSFetchRequest(entityName: "Words") 

    //This is the line where the error happens 
    fetchRequest.predicate = NSPredicate(format: "level = %@", level) 
    fetchRequest.predicate = NSPredicate(format: "section = %@", section) 

    let word = AppDelegate().managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as [Words] 

    if(word.count > 1) 
    { 
     for words in word 
     { 
      println(words.word) 
      return words.word 
     } 
    } 

    return "ERROR" 
    } 
} 
+0

L'errore finale era dovuto alla mancata possibilità di eseguire "AppDelegate()." per accedere a managedObjectContext. Invece questo codice ha funzionato per me "var appDel: AppDelegate = (UIApplication.sharedApplication(). Delegate come AppDelegate)" Spero che questo aiuti chiunque – Cesarg219

risposta

30

Il %@ segnaposto in stringhe di formato predicato è per gli oggetti Objective-C , in modo da avere per avvolgere il numero intero in un NSNumber:

fetchRequest.predicate = NSPredicate(format: "level = %@", NSNumber(integer: level)) 

o utilizzare ld invece per formattare un (lungo) integer:

fetchRequest.predicate = NSPredicate(format: "level = %ld", level) 

Si noti inoltre che

fetchRequest.predicate = NSPredicate(format: ...) 
fetchRequest.predicate = NSPredicate(format: ...) 

fa non creare un predicato composto, l'assegnazione secondi semplicemente sovrascrive il primo. È possibile utilizzare un NSCompoundPredicate:

let p1 = NSPredicate(format: "level = %ld", level)! 
let p2 = NSPredicate(format: "section = %ld", section)! 
fetchRequest.predicate = NSCompoundPredicate.andPredicateWithSubpredicates([p1, p2]) 

o semplicemente combinare i predicati con "E":

fetchRequest.predicate = NSPredicate(format: "level = %ld AND section = %ld", level, section) 
0

Invece di agitarsi in giro con le conversioni di formato e AND subpredicates, è possibile utilizzare il PredicatePal quadro:

fetchRequest.predicate = *(Key("level") == level && Key("section") == section) 

si noti che è necessario utilizzare == invece di = per l'uguaglianza confronto.

+2

E qui è il problema con l'affidarsi al codice di terze parti, PredicatePal non è stato aggiornato in oltre un anno –

Problemi correlati