强制解缠选项与隐式解包选项之间的区别

SLN*_*SLN 25 optional swift forced-unwrapping

我最初对强行展开和隐式展开非常困惑.现在,以下理解来自我的自学:

没有可用的隐含解包的动作,但有一些所谓的隐式解开选配.隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用.Normal Optionals需要if let绑定强制unwrapping(!)动作来访问可选变量后面的可能值.

摘要:

强迫去包裹是一个行动的正常选配完成.

隐式解包的Optionals Optionals,通常用于类初始化,并在使用时传递没有感叹号的值.

问题:

我对吗?如果我的理解不准确,如果你纠正我,我将不胜感激.

谢谢

Luc*_*tti 77

首先让我们定义一个Optional

可选的值是一个容器的一些类型(Int,String,UIColor,...),它可以包含值(1,"Hello world",.greenColor(),...)或nil.

let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在Swift中,我们看到一个我们认为的可选值:

好的,这可能包含实际价值或 nil

强行打开

这是提取内部包含的值的动作Optional.这个操作很危险,因为你告诉编译器:我确定这个Optional值确实包含一个实际值,然后解压它!

let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
Run Code Online (Sandbox Code Playgroud)

现在anInt包含值1.

在此输入图像描述

如果我们对包含nil我们得到的可选值执行强制解包fatalError,则应用程序会崩溃并且无法恢复它.

let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

隐含未解包的期权

当我们定义一个Implicitly unwrapped可选项时,我们定义一个容器,每次读取它时都会自动执行一次强制解包.

var text: String! = "Hello"
Run Code Online (Sandbox Code Playgroud)

如果现在我们读 text

let name = text
Run Code Online (Sandbox Code Playgroud)

我们没有得到一个可选的String但是普通的,String因为text它自动解开它的内容.

但是文本仍然是可选的,因此我们可以nil在其中放置一个值

text = nil
Run Code Online (Sandbox Code Playgroud)

但是一旦我们读到它(并且它包含nil),我们就会得到一个致命的错误,因为我们正在解包一个可选的包含nil

let anotherName = text

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你这么完整的解释 (4认同)
  • 很好的解释,我只想指出,强制解包本身并不危险,仅当您处理的数据可能为零且不受您的控制时才是危险的。另一方面,如果您只是在谈论编写的函数,则将一些本地范围的数据传递给编写的另一个函数,则在第二个函数中强制展开仍会产生错误,但这就是“好”错误告诉您代码中存在错误(因为您可能传递了错误的arg)。 (3认同)
  • 谢谢你的努力. (2认同)

Tar*_*epp 5

隐式展开可选的是幕后正常可选的,但也可以像非可选值使用,所以是的,你是正确的.

但是如果你声明一个值是隐式展开的,那么它相当于强制在每次使用时展开它.

对于隐式解包的选项,有4个主要原因可以做到这一点.

1:初始化期间无法定义的常量

2:与Objective-C API交互

3:当你的应用程序无法从变量存在中恢复时 nil

4:NSObject初始化器