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

Posted

技术标签:

【中文标题】XCode 6 Beta 6 Beta 7 中的错误 - 可选类型的值未解包【英文标题】:XCode 6 Beta 6 Error in Beta 7 - Value of optional type not unwrapped 【发布时间】:2014-11-07 14:25:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

错误是相当微不足道的,这里没有太多要分析的。尝试改变这个:

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? 

...? 字符清楚地告诉我们此方法返回一个可选值。

【讨论】:

【参考方案2】:

我假设 Model 初始化器签名是:

init(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext)

编译错误是因为NSEntityDescription.entityForName返回一个可选的,所以你必须解开它。

至于运行时错误,我的猜测是contxt 为nil,而你在这里传递的是强制解包:

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)
    

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

【讨论】:

以上是关于XCode 6 Beta 6 Beta 7 中的错误 - 可选类型的值未解包的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7 beta (5 & 6) 看不到某些 VC 的 IBOutlets

Xcode 6 beta 7 UIView.animateWithDuration 调用中的额外参数“usingSpringWithDamping”

XCode 7 beta 6 UI 测试 - 无法选择列表中的元素

条件绑定中的绑定值在 Xcode Beta 7 中必须是 Optional 类型,而不是在 beta 6 中

条件绑定中的绑定值在 Xcode Beta 7 中必须是 Optional 类型,而不是在 beta 6 中

Xcode 8 Beta 6 不支持 iOS 10 Beta 7 sdk