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

时间:2015-01-28 20:01:10

标签: ios swift core-data predicate

我尝试使用多个NSPredicates从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声明中。我尝试了keyString NSString参数,但我不是问题。我对swift很新,我无法弄清楚这里有什么问题。

1 个答案:

答案 0 :(得分:1)

EXC_BAD_INSTRUCTION通常会导致展开值为nil的变量。 这正是您return existingSetting!时代码中发生的情况,因为代码中的existingSetting总是nil(您可能错过了编写{{1}的作业})。

为了解决此问题,您可以更改功能签名以返回可选的println(fetchResults.first!.value)

Setting

然后,在函数结束时,只返回public class func fetchSetting(key: NSString, countryId: Int) -> Setting? ,而不用感叹号打开它。

existingSetting

当您从return existingSetting 调用fetchSetting函数时,您可以使用典型的Swift构造viewDidLoad()来测试您是否具有非nil值:< / p>

if let