「?」を使った変数の装飾のスウィフト (疑問符)と“!” (エクスクラメーション・マーク)


106

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

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

つまり、簡単に言うと、次のようなことをしたときに初期化される変数は何ですか。

var aShape : CAShapeLayer!

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


これを確認すると、変数がnil ないことを確認できます。
マティアス2014年

これは重複としてマークされるべきではないと思います。「オプションとは?」「2つのタイプのオプションの違いは何ですか?」と同じ質問ではありません。これは、この質問が何であるかということです
ジアアロ2014年

@Jiaaroはその場合でも、オプション、暗黙的にアンラップされたオプションなどに関する質問がすでにたくさんあります。また、この1を参照することができます。stackoverflow.com/questions/24272781/...
ジャック

@JackWuわかりましたが、質問されたとき、この質問は重複ではなかったと思います。(たとえば、例の1週間前に質問されました)
ジアアロ2014年

あなたは良い点を作る@Jiaaro、私は...これはもう一方ではなく、この1の重複としてマークされるべきであることをolder..maybeだった気付かなかった
ジャック

回答:


145

型宣言で!は、これはに似てい?ます。どちらもオプションですが、これ!は「暗黙的にアンラップされた」オプションです。つまり、値にアクセスするためにアンラップする必要はありません(ただし、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
}

7
暗黙的にアンラップされたオプションは、Swiftプログラミング言語の 56ページから始まる適切な名前のセクションで説明されています。
カレブ

@Caleb暗黙的に
ラップ

素晴らしい情報、ありがとう。Swiftがこれまでに強制している安全性を一般的に愛することで、バグが大幅に減少するはずです:)。
Jason Renaldo 2014年

@Jiaaro:共有していただきありがとうございます。上記の例でユーザーが完全に理解できるようにします。:)
Esha

3
これは基本的に、objective-cですでに行っていた動作です」という文混乱を招く可能性があると思います。Objective-Cでは、nil値にアクセスして実際に「操作」できます。nilの場合、暗黙的にラップされていないオプションにすばやくアクセスする、ランタイム例外スローされます。
Sascha Wolf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.