我尝试使用多个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)
}
错误发生在keyPredicate
和countryPredicate
声明中。我尝试了key
和String
NSString
参数,但我不是问题。我对swift很新,我无法弄清楚这里有什么问题。
答案 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