力量展开期权与隐式解包期权之间的差异

时间:2016-08-07 18:59:24

标签: swift optional forced-unwrapping

我一开始很担心被迫展开和隐式展开。现在,以下理解来自我的自学:

没有操作可用于隐式展开,但有一些称为隐式展开的Optionals。隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用。普通可选项需要 if let绑定强制解包(!)操作才能访问可选变量背后的可能值。

摘要

强制解包 是对正常选项进行的操作

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

问题

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

由于

4 个答案:

答案 0 :(得分:72)

首先让我们定义一个Optional

可选值是某种类型的容器IntStringUIColor,...),它可以包含值({ {1}},1"Hello world",...)或.greenColor()

nil

enter image description here

在Swift中,我们会看到一个可选值:

  

好的,这可能包含实际值或let anOptionalInt: Int? = 1 let anotherOptionalInt: Int? = nil

强制展开

提取 nil中包含的值的操作。 这个操作很危险,因为你告诉编译器:我确定这个Optional值确实包含一个实际值,解压缩它!

Optional

现在let anOptionalInt: Int? = 1 let anInt: Int = anOptionalInt! 包含值1。

enter image description here

如果我们对恰好包含anInt的可选值执行强制解包,我们会得到nil,该应用确实崩溃,无法恢复。

fatalError

enter image description here

隐式解包的选项

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

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

fatal error: unexpectedly found nil while unwrapping an Optional value

如果现在我们阅读var text: String! = "Hello"

text

我们没有获得可选的let name = text ,而是String,因为String会自动解包它的内容。

然而,文本仍然是可选的,因此我们可以在其中加上text

nil

但是一旦我们阅读它(并且它包含text = nil ),我们就会收到致命错误,因为我们正在展开包含nil

的可选项
nil

答案 1 :(得分:5)

隐式展开的可选项是幕后的常规可选项,但也可以像非可选值一样使用,所以是的,正确

但是如果你将一个值声明为隐式展开,则相当于强制在每次使用时展开它。

对于隐式解包的选项,有4个主要原因。

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

2:与Objective-C API交互

3:当您的应用无法从变量nil

恢复时

4:NSObject初始值设定项

答案 2 :(得分:2)

我会说不,你正在画出一个错误的区别:

  • 上半场是对的;解包当然是你对Optionals所做的事情,强制解包是一种方法(不安全的方式)。

  • 但至于隐式解包的Optional是什么:它是一种标记Optional类型的方式,以便你完成强制解包(如果你在一个地方使用Optional)它不能使用,但如果它被打开就可以使用。

答案 3 :(得分:0)

隐式展开 当定义这样的Optional类型时,可以将其定义为隐式解包。

让unwrappedString:字符串!

此技术使您可以告诉编译器自动解包该值,就好像它根本不是可选的一样。 类似于类型?这是可选类型的语法糖!等效于ImplicitlyUnwrappedOptional。 隐式展开的可选内容的一个常见示例是视图控制器如何定义其IBOutlet:

@IBOutlet var displayLabel:UILabel! @IBOutlet var actionButton:UIButton!

将插座定义为隐式展开的可选是有道理的,因为它们将由Interface Builder实例化。总是在视图控制器内部打开每个视图出口会很麻烦。 由于它们具有隐式展开的特性,如果您忘记将插座连接到它,则Interface Builder视图会在运行该应用程序时尝试在视图控制器中访问它时出现运行时错误。