Obj-C 框架返回 nil,并让我的 Swift 代码崩溃,说“致命错误:在展开可选值时意外发现 nil”

Posted

技术标签:

【中文标题】Obj-C 框架返回 nil,并让我的 Swift 代码崩溃,说“致命错误:在展开可选值时意外发现 nil”【英文标题】:Obj-C frameworks returns nil, And crashes my Swift Code saying 'fatal error: unexpectedly found nil while unwrapping an Optional value' 【发布时间】:2015-04-09 08:28:33 【问题描述】:

我正在使用一个用 Obj-C 编写的第三方框架,它有一个功能:

- (NSError *)generateModelForm

If this method is successful it will return nil. If it doesn't return nil, it will return an error which you can check for debugging purposes.

现在,当我在我的 Swift 文件中使用桥接头调用此函数并执行所有必需的操作时,它总是在第一行崩溃说“致命错误:在展开可选值时意外发现 nil”

我的 Swift 代码:

if let error = object.generateModelForm()

    println("Error : \(error)")

else

     println("Successfully generated model form, proceed ahead.")

我已经阅读了关于此link 的描述。但这对我几乎没有帮助,因为我使用的函数是用 Obj-C 编写的预定义框架的一部分。

我尝试将第一行替换为,

let error = object.generateModelForm() as NSError?
let error : NSError? = object.generateModelForm()

另外,即使尝试直接调用object.generateModelForm(),不捕获返回的NSError值,它仍然会崩溃。

过去 2 天我一直在摸索,如果有任何帮助,将不胜感激。

【问题讨论】:

当您访问它的方法时,您确定该对象不是 nil 吗? 是的..我很确定,因为我在崩溃之前使用了很多次..甚至能够使用框架的其余方法。 !! 设置断点并确认object 不为零。这是唯一有意义的解释 @Paulw11 做到了,对象不是零。 'object' 是可选的吗?尝试 object?.generateModelForm() ...* 使用 '?' ... 【参考方案1】:

如果 'object' 是可选的,请尝试 object?.generateModelForm() ... 使用 '?'。

【讨论】:

【参考方案2】:

如果你一直在使用 Swift 1.1,你应该在执行 if let 时解包

if let error = object.generateModelForm()? 
  //do stuff

请注意,如果您刚刚为 if 块内的范围创建的常量变量实际上是一个未包装的现有对象,则 if let 只允许您执行操作。您尝试做的是将可选设置为非可选

Swift 1.2(从今天 2015 年 4 月 9 日起可与 Xcode 6.3 一起使用)您不需要添加它,但如果您想将其转换为 NSError

if let error = object.generateModelForm() as? NSError 
  //do stuff

【讨论】:

以上是关于Obj-C 框架返回 nil,并让我的 Swift 代码崩溃,说“致命错误:在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章

UIView 类中的 CollectionView IBOutlet 返回 nil - 只是有时?

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

将 Swift 框架导入到 Obj-C

将 Obj-C 桥接到 Swift 后缺少啥

Paypal iOS SDK 返回一个错误并让我的应用程序崩溃

解析 PFUser.currentUser 返回 nil - Swift