2015-02-20 7 views
7

Ich versuche, NSPredate in Swift Core-Daten abzufragen, aber es wirft einen EXC_BAD_ACCESS (Code = 1, Adresse = 0x1) Fehler beim Versuch zu laufen es, was mache ich falsch?Swift NSPredicate EXC_BAD_ACCESS (Code = 1, Adresse = 0x1) beim Compoundieren von Anweisungen

Hier ist die Datei, wo der Fehler

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

Der letzte Fehler war nicht in der Lage, "AppDelegate()" zu tun. um auf den managedObjectContext zuzugreifen. Stattdessen funktionierte dieser Code für mich "var appDel: AppDelegate = (UIApplication.sharedApplication(). Delegate als AppDelegate)" Hoffe, das hilft jedem – Cesarg219

Antwort

30

Der %@ Platzhalter in Prädikat Formatstrings geschieht, ist für Objective-C Objekte, so dass Sie die ganze Zahl in eine NSNumber zu wickeln haben:

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

oder verwenden ld stattdessen eine (lange) integer zu formatieren:

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

Beachten Sie auch, dass

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

tut nicht eine Verbindung Prädikat erstellen, die Sekunden Zuordnung einfach die erste überschreibt.

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

oder einfach kombinieren die Prädikate mit "AND":

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

Statt Getue um mit Formatkonvertierungen und AND subpredicates, können Sie den PredicatePal Rahmen verwenden: Sie können ein NSCompoundPredicate verwenden

Beachten Sie, dass Sie == anstelle von = für die Gleichheit verwenden müssen Vergleich.

+2

Und hier ist das Problem mit der Abhängigkeit von 3rd Party Code, PredicatePal wurde nicht in über einem Jahr aktualisiert –

Verwandte Themen