Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift NSPredicate throwing EXC_BAD_ACCESS(Code=1, address=0x1) when compounding statements

I am trying to use NSPredicate in Swift to query Core Data but it throws an EXC_BAD_ACCESS(Code=1, address=0x1) error when trying to run it, what am I doing wrong?

Here is the file where the error happens

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"   } } 
like image 236
Cesarg2199 Avatar asked Feb 20 '15 02:02

Cesarg2199


1 Answers

The %@ placeholder in predicate format strings is for Objective-C objects, so you have to wrap the integer into an NSNumber:

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

or use ld instead to format a (long) integer:

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

Note also that

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

does not create a compound predicate, the seconds assignment simply overwrites the first. You can use an NSCompoundPredicate:

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

or simply combine the predicates with "AND":

fetchRequest.predicate = NSPredicate(format: "level = %ld AND section = %ld", level, section) 
like image 50
Martin R Avatar answered Sep 20 '22 14:09

Martin R