【问题标题】:Swift NSPredicate throwing EXC_BAD_ACCESS(Code=1, address=0x1) when compounding statementsSwift NSPredicate 在复合语句时抛出 EXC_BAD_ACCESS(Code=1, address=0x1)
【发布时间】:2015-04-21 15:34:17
【问题描述】:

我试图在 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)”希望这对任何人都有帮助

标签: swift core-data nspredicate


【解决方案1】:

谓词格式字符串中的%@ 占位符用于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)

【讨论】:

    【解决方案2】:

    您可以使用PredicatePal 框架,而不是大惊小怪的格式转换和AND 子谓词:

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

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

    【讨论】:

    • 这是依赖 3rd 方代码的问题,PredicatePal 一年多没有更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多