我一直在努力做一个简单的CoreData任务,保存数据。我确定它在Beta 6中有效,但在更新到Beta 7后会出现错误。
我想我必须添加'?'或者'!'基于错误提示,但只是不够聪明,无法弄清楚在哪里!
@IBAction func saveItem(sender: AnyObject) {
// Reference to App Delegate
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
// Reference our moc (managed object content)
let contxt: NSManagedObjectContext = appDel.managedObjectContext!
let ent = NSEntityDescription.entityForName("List", inManagedObjectContext: contxt)
// Create instance of our data model and initialize
var newItem = Model(entity: ent, insertIntoManagedObjectContext: contxt)
// Map our attributes
newItem.item = textFieldItem.text
newItem.quanitity = textFieldQuantity.text
newItem.info = textFieldInfo.text
// Save context
contxt.save(nil)
}
错误说
Value of optional type 'NSEntityDescription?' not unwrapped; did you mean to use '!' or '?'
在
行var newItem = Model(entity: ent, insertIntoManagedObjectContext: contxt)
每当我似乎清除了错误并编译好后,点击“保存”即可。显示在调试区域
fatal error: unexpectedly found nil while unwrapping an Optional value
答案 0 :(得分:0)
这个错误相当简单,这里分析的内容不多。尝试更改此内容:
let ent = NSEntityDescription.entityForName("List", inManagedObjectContext: context)
到这个
let ent = NSEntityDescription.entityForName("List", inManagedObjectContext: context)!
与往常一样,新手倾向于忽略告诉标志。该错误清楚地表明可选的类型为NSEntityDescription
。鉴于在给定的代码中只有这种类型的对象被实例化,所以猜测错误所在的位置并不需要天才。
Value of optional type 'NSEntityDescription?' not unwrapped; did you mean to use '!' or '?'
此外,此处用于实例化NSEntityDescription对象的方法声明如下:
class func entityForName(entityName: String, inManagedObjectContext context: NSManagedObjectContext) -> NSEntityDescription?
... ?
字符明确告诉我们此方法返回一个可选项。
答案 1 :(得分:0)
我认为Model
初始化程序签名是:
init(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext)
发生编译错误,因为NSEntityDescription.entityForName
返回一个可选项,因此您必须将其解包。
至于运行时错误,我的猜测是contxt
为零,而你正在通过强制解包:
let ent = NSEntityDescription.entityForName("List", inManagedObjectContext: contxt)
为了使代码更安全,更清晰,我明确地使用了选项:
let contxt: NSManagedObjectContext? = appDel.managedObjectContext
if let contxt = contxt {
let ent: NSEntityDescription? = NSEntityDescription.entityForName("List", inManagedObjectContext: contxt)
// Create instance of our data model and initialize
if let ent = ent {
var newItem = Model(entity: ent, insertIntoManagedObjectContext: contxt)
}
}
并使用调试器&断点以检查任何提到的变量是否为零。