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文档的基础部分。