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

时间:2014-06-09 14:36:45

标签: swift optional

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

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

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

var aShape : CAShapeLayer!

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

1 个答案:

答案 0 :(得分:138)

在类型声明中,!?类似。两者都是可选的,但!是" implicitly unwrapped" optional,这意味着您不必打开它来访问该值(但它仍然可以为零)。

这基本上是我们在objective-c中已经拥有的行为。值可以为零,您必须检查它,但您也可以直接访问该值,就好像它不是可选的(重要的区别在于,如果您没有&# 39;检查是否会发生运行时错误

// 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
}