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

Sno*_*man 17 swift

这个名字!总是让我感到困惑:它被称为'隐式解包的可选'.但是,隐含的是什么呢?隐含意味着"隐含但不明白".但是,没有!明确表达其目的吗?不添加!明确表达我们想要实现的目标吗?

dre*_*wag 25

在Swift中,尾随感叹号(!)以两种不同的方式使用.一种叫做强制解缠.这是当你有一个变量被定义为Optional并且你想要基本断言该值不是nil时你可以使用它,好像它不是可选的:

var optionalName: String? = "World"
if optionalName != nil {
    sayHelloTo(optionalString!)
}
Run Code Online (Sandbox Code Playgroud)

另一种可以描述"强制解包"的方法是"显式展开",但如果你试图"强制解包"一个nil的可选项,强制会增加整个程序崩溃的额外提示.

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

var name: String! = "World"
if name != nil {
    sayHelloTo(name)
}
Run Code Online (Sandbox Code Playgroud)

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

就像"Forced Unwrapping"一样,如果你尝试使用它时,"Implicitly Unwrapped Optional"仍会使整个程序崩溃


Bry*_*hen 6

普通可选

var foo : Foo? = Foo()
foo!.doSomething() // explicitly unwrap it and call the method
Run Code Online (Sandbox Code Playgroud)

隐式解包可选

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

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