NSPredicate - EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

NSPredicate - EXC_BAD_INSTRUCTION (code= EXC_I386_INVOP, subcode=0x0)

我正在尝试使用多个 NSPredicate 从 CoreData 读取数据,但我得到 EXC_BAD_INSTRUCTION (code= EXC_I386_INVOP, subcode=0x0)

这是我尝试读取数据的代码:

public class func fetchSetting(key: NSString, countryId: Int) -> Setting {
    let fetchRequest = NSFetchRequest(entityName: "Setting")

    var existingSetting: Setting?

    let keyPredicate = NSPredicate(format: "key == %@", key)
    let countryPredicate = NSPredicate(format: "countryId = %d", countryId)

    let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: [keyPredicate!, countryPredicate!])

    fetchRequest.predicate = predicate

    if let fetchResults = CoreDataHelper().managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [Setting] {
        if (!fetchResults.isEmpty && fetchResults.count > 0) {
            println(fetchResults.first!.value)
        } else {
            existingSetting = nil
        }
    } else {
        existingSetting = nil
    }

    return existingSetting!
}

我就是这样调用这个函数的:

override func viewDidLoad() {
    super.viewDidLoad()
    textColorSetting = SettingCoreData.fetchSetting("text_color", countryId: 3)
}

错误在 keyPredicatecountryPredicate 声明处。我尝试将 key 参数作为 StringNSString,但我不认为这是问题所在。我是 swift 的新手,我真的不知道这里出了什么问题。

通常情况下 EXC_BAD_INSTRUCTION 是由于展开一个值为 nil 的变量。
这正是你 return existingSetting! 时代码中发生的情况,因为 existingSetting 在你的代码中总是 nil (你可能错过了你写 [=18= 的作业) ]).

为了解决这个问题,您可以将函数签名更改为 return 一个可选的 Setting:

public class func fetchSetting(key: NSString, countryId: Int) -> Setting?

然后,在函数的末尾,只是 return existingSetting,没有用感叹号展开它。

return existingSetting

当您从 viewDidLoad() 调用 fetchSetting 函数时,您可以使用典型的 Swift 结构 if let:

override func viewDidLoad() {
    super.viewDidLoad()
    if let textColorSetting = SettingCoreData.fetchSetting("text_color", countryId: 3) {
        // Do stuff with textColorSetting
    }
}