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)
}
错误在 keyPredicate
和 countryPredicate
声明处。我尝试将 key
参数作为 String
和 NSString
,但我不认为这是问题所在。我是 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
}
}
我正在尝试使用多个 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)
}
错误在 keyPredicate
和 countryPredicate
声明处。我尝试将 key
参数作为 String
和 NSString
,但我不认为这是问题所在。我是 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
}
}