当组合语句时,Swift NSPredicate抛出EXC_BAD_ACCESS(Code = 1,address = 0x1)错误。

28

我正在尝试在Swift中使用NSPredicate查询Core Data,但当尝试运行它时,它会抛出EXC_BAD_ACCESS(Code=1, address=0x1)错误,我做错了什么?

这是发生错误的文件

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"
  }
}

最终的错误是由于无法执行“AppDelegate()”以访问managedObjectContext。相反,这段代码对我有用:“var appDel:AppDelegate =(UIApplication.sharedApplication().delegate as AppDelegate)”。希望这能帮助任何人。 - Cesarg2199
2个回答

79

在谓词格式字符串中,%@ 占位符是用于 Objective-C 对象的,因此您需要将整数包装到 NSNumber 中:

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

或者使用ld来格式化(长)整数:

fetchRequest.predicate = NSPredicate(format: "level = %ld", level)
注意,还要注意一点

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

不会创建一个复合谓词,第二个赋值只是简单地覆盖了第一个。您可以使用NSCompoundPredicate

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

或者简单地使用“AND”组合谓词:

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

-3

不必纠结于格式转换和AND子谓词,您可以使用PredicatePal框架:

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

请注意,在进行相等比较时,您需要使用==而不是=

4
这里依赖第三方代码的问题就出在这里,PredicatePal已经超过一年没有更新了。 - Ashley Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接