Swift变量装饰用"?" (问号)和"!" (感叹号)

Jas*_*ldo 103 optional swift

我知道在Swift中所有变量都必须设置一个值,并且通过使用选项,我们可以设置一个nil最初设置的变量.

我不明白的是,用a设置一个变量!是做什么的,因为我认为这会从一个可选项中"解开"一个值.我想通过这样做,你保证有一个值来展开该变量,这就是为什么在IBActions上你会看到它被使用.

所以简单地说,当你做这样的事情时,初始化的变量是什么:

var aShape : CAShapeLayer!
Run Code Online (Sandbox Code Playgroud)

为什么/我什么时候会这样做?

Jia*_*aro 140

在类型声明!中类似于?.两者都是可选的,但它!是一个" 隐式解包"的可选项,这意味着您不必打开它来访问该值(但它仍然可以是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
Run Code Online (Sandbox Code Playgroud)

用法:

// 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
}
Run Code Online (Sandbox Code Playgroud)

  • 从*Swift编程语言*的第56页开始,在一个恰当命名的部分中描述了隐式解包的选项. (6认同)
  • 我认为句子"*这基本上是我们在objective-c*中已经存在的行为"可能令人困惑.在objective-c中,可以访问一个`nil`值并实际上与它"一起工作",快速访问一个隐式解包的可选项,而它的nil __will__会抛出一个运行时异常. (3认同)