在解开一个Optional值时意外地发现了nil - Swift

时间:2014-10-19 11:06:13

标签: core-data swift ios8

我收到此错误:fatal error: unexpectedly found nil while unwrapping an Optional value 在这个功能中:

   func textFieldShouldReturn(textField: UITextField) -> Bool {

    tableViewData.append(textField.text)
    textField.text = ""
    self.tableView.reloadData()
    textField.resignFirstResponder()

    // Reference to our app delegate

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

    // Reference moc

    let contxt: NSManagedObjectContext = appDel.managedObjectContext!
    let en = NSEntityDescription.entityForName("note", inManagedObjectContext: contxt)

    // Create instance of pur data model an initialize

    var newNote = Model(entity: en!, insertIntoManagedObjectContext: contxt)

    // Map our properties

    newNote.note = textField.text

    // Save our context

    contxt.save(nil)
    println(newNote)

    // navigate back to root vc

    //self.navigationController?.popToRootViewControllerAnimated(true)

    return true
}

和这行代码:

 var newNote = Model(entity: en!, insertIntoManagedObjectContext: contxt)

有人有解决此错误的方法吗? 我使用xCode 6.0.1。编程语言是Swift,模拟器是用iOS8(iPhone 5s)运行的。

2 个答案:

答案 0 :(得分:1)

NSEntityDescription.entityForName("note", inManagedObjectContext: contxt)会返回NSEntityDescription?。所以它是可选的,可以是nil。当你强行打开它(使用!运算符)时,如果它是nil,那么你的程序会崩溃。为了避免这种情况,您可以使用if-let语法。方法如下:

if let entity = NSEntityDescription.entityForName("note", inManagedObjectContext: contxt) {
    // Do your stuff in here with entity. It is not nil.
}

然而,在核心数据中,实体的原因变为nil,或许您将名称“注释”拼写错误。检查你的xcdatamodel文件。

答案 1 :(得分:0)

当您打开包含nil的可选项时,会发生该错误。如果这是导致错误的行,则它将en变量设置为nil,并且您正试图强制解包它。

我无法提供nil的理由,但我建议避免使用强制解包(即使用!运算符),而是依赖可选绑定:

if let en = en {
    var newNote = Model(entity: en, insertIntoManagedObjectContext: contxt)

    // Map our properties

    newNote.note = textField.text

    // Save our context

    contxt.save(nil)
    println(newNote)
}

解决了这个例外。您应该调查ennil的原因。