为什么是!在Swift中称为“隐式”而不是“明确”展开的可选项?

时间:2014-07-22 00:08:28

标签: swift

!的名字总是让我感到困惑:它被称为'隐式解包的可选'。但是,隐含的是什么呢?隐含意味着“隐含但不明白”。但是,不添加!明确表达其目的吗?不添加!会明确我们要完成的工作吗?

2 个答案:

答案 0 :(得分:22)

在Swift中,尾随感叹号(!)以两种不同的方式使用。一个叫Forced Unwrapping。这是当你将一个变量定义为一个Optional并且你想基本断言该值不是nil时,你可以像使用它一样使用它:

var optionalName: String? = "World"
if optionalName != nil {
    sayHelloTo(optionalString!)
}

您可以描述的另一种方式"强制展开"是"显式展开",但强制添加额外的提示,如果你试图"强制解包"整个程序将崩溃?一个可选的nil。

第二种是当你实际声明一个变量的类型时,它被称为Implicitly Unwrapped Optional。这适用于您希望声明技术上可选的变量,但您会将其视为不可选的变量。每次你使用这个Implicitly Unwrapped Optional时,它实际上是在进行" Force Unwrapping"我在上面描述过:

var name: String! = "World"
if name != nil {
    sayHelloTo(name)
}

你仍然可以为nil测试一个Implicitly Unwrapped Optional,但你也可以直接使用它,就像它不是可选的一样。这就是为什么它被认为是隐含。每次使用它时,都会自动隐式为您解开。

喜欢"强迫展开" "隐式解包可选"如果你尝试使用它时,它仍然会崩溃整个程序

答案 1 :(得分:6)

普通可选

var foo : Foo? = Foo()
foo!.doSomething() // explicitly unwrap it and call the method

隐式解包可选

var foo : Foo! = Foo()
foo.doSomething() // implicitly unwrap it and call the method just like it is not optional

在这两种情况下,您都需要声明一个可选项(?!)。 Implicitly Unwrapped Optional不会添加更多内容。但是在使用它时你可以省略解包操作符。