!
的名字总是让我感到困惑:它被称为'隐式解包的可选'。但是,隐含的是什么呢?隐含意味着“隐含但不明白”。但是,不添加!
明确表达其目的吗?不添加!
会明确我们要完成的工作吗?
答案 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不会添加更多内容。但是在使用它时你可以省略解包操作符。