Beta 7中的XCode 6 Beta 6错误 - 未解包的可选类型的值

时间:2014-09-13 15:27:30

标签: core-data swift xcode6 xcode6-beta7

我一直在努力做一个简单的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

2 个答案:

答案 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)
    }
}

并使用调试器&断点以检查任何提到的变量是否为零。