NSData:意外地发现零,而解包一个可选的值

这可能是基本的快速排队,但我是新的迅速或iOS开发。 我得到错误fatal error: unexpectedly found nil while unwrapping an Optional value

对于波纹pipefunction

  func Call() -> NSData? { let nilObj: NSData? = nil if(false){ // Doing something } else { return nilObj! } } 

我只是想在其他情况下返回零的NSData,但我得到错误。 我相信我错过了一些明显的东西,任何人都可以帮忙。

你声明nilObj是可选的,并用nil初始化它。 那么在你的else条款中,你正试图解开这个问题。 为了解决这个问题,你只需要删除它!

将您的代码更改为:

 func Call() -> NSData? { let nilObj: NSData? = nil if(false) { // Doing something } else { return nilObj } } 

那么,错误说这一切! 你正试图强制打开一个可选的。 你应该使用if let语法,而解包一个可选。

swift中的可选项最初可能会引起混淆,但是有助于记住它们只是一个枚举types:

 enum Optional<T> { case None case Some(T) // swift enums can have data associated to them } 

如果你确定你的可选值没有零值,也就是说,你可以通过感叹号来访问这个底层的值! 运营商。

总之,强制解包optional! 在说:“好吧,我确定这个可选项包含非零值,给我。”

这就是所谓的解压 。 你告诉系统访问与.Some(T)对应的值,尽pipe你没有检查你的可选项是.None还是.None 。 如果你强行拆包 ! 你的可选结果是一个。 .None ,你会得到运行时错误,你unexpectedly found nil while unwrapping an Optional value

作为一个经验法则,你应该总是检查你的可选项,然后解开它们。 在很less的情况下,你应该假设一个可选的非零,并强制拆包 。 例如,如果您尝试在prepareForSegue访问它,那么即使是一个IBOutlet也可能是nil 。 XCode会自动将插口隐藏起来,因为对于视图控制器的大部分生命周期来说,它们不会是 。 但是,对于这些不常见的边缘情况,你还是要照顾好自己。

你可以检查一个可选项是否具有非零值的标准方式

 if optional != nil { // force-unwrapping after nil check is fine optional!.someMethod() } else { // 'optional' is nil } 

用swift做一个更习惯的方法是通过可选的绑定

 // binds the constant 'value' to your optional if it is non-nil if let value = optional { value.someMethod() } else { // optional is nil } 

第三种检查方式是使用警戒语句警卫语句的语义与前面的语句有所不同。 您也可以混合使用警戒语句可选的绑定

 guard optional != nil else { // optional is nil. // by the end of this branch you must exit the block that // encloses the guard statement, such as with a return or break return } // if control reaches here you're guaranteed optional is non-nil 

Guard语句是一个很快捷的function,因为你可以专注于你想要的条件,而不是你不想要的。 它也保持处理违反要求的代码旁边的要求。 与if语句做同样的事情相比, 警卫通过明确地expression意图来提高可读性。

要了解更多,请参阅swift文档的基础部分。