web-dev-qa-db-ja.com

Swift "?"(疑問符)および "!"(感嘆符)を使用した可変装飾

Swiftではすべての変数に値を設定する必要があり、オプションを使用することで最初にnilに設定する変数を設定できることを理解しています。

私が理解していないのは、!で変数を設定することは、これがオプションの値を「アンラップ」するという印象を受けていたからです。そうすることで、その変数にラップ解除する値があることを保証していると思いました。これが、IBActionsなどで使用されていることがわかる理由です。

したがって、単純に言えば、次のようなことをするときに初期化される変数は何ですか:

var aShape : CAShapeLayer!

そして、なぜ/いつこれを行うのですか?

103
Jason Renaldo

型宣言では、!?に似ています。両方ともオプションですが、!は「 暗黙的にアンラップされた」オプション です。つまり、値にアクセスするためにアンラップする必要はありません(ただし、nilのままでもかまいません)。

これは基本的に、objective-cで既に行った動作です。値canは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
}
140
Jiaaro