一尘不染

带有“?”的快速可变装饰 (问号)和“!” (感叹号)

swift

我了解在Swift中所有变量都必须设置一个值,并且通过使用可选参数,我们可以将变量设置为nil初始值。

我不明白的是,用a设置变量的作用!是什么,因为我的印象是这会“取消包装”来自可选值的值。我认为通过这样做,您可以保证在该变量中有一个要解包的值,这就是在IBActions上使用它的原因。

简而言之,当您执行以下操作时,要初始化的变量是什么:

var aShape : CAShapeLayer!

为何/何时执行此操作?


阅读 293

收藏
2020-07-07

共1个答案

一尘不染

在类型声明中,!类似于?。两者都是可选的,但是!是“
隐式展开的”可选的,这意味着您不必解包即可访问值(但它仍然可以为nil)。

这基本上是我们在Objective-C中已经拥有的行为。值 可以
为nil,您必须检查该值,但是您也可以直接访问该值,就好像它不是可选值一样(重要的区别是,如果不检查nil,您将得到一个运行时错误)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

用法:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}
2020-07-07