web-dev-qa-db-ja.com

Force Unwrapping OptionalsとImplicitly Unwrapped Optionalsの違い

最初は、強制的なアンラップと暗黙的なアンラップについて非常に混乱していました。今、私の自習から次の理解が得られました。

noアクションは暗黙的なアンラップに使用できますが、暗黙的にアンラップされたオプションと呼ばれるものがあります。暗黙的にアンラップされたオプションと通常のオプションはどちらもオプションです。暗黙的にアンラップされたオプションにアクセスするときの違いは、ボンネットの下に有効な値があり、すぐに使用できることです。通常のオプションにはif let bindingまたは強制的なアンラッピング(!)actionオプション変数の背後にある可能な値にアクセスします。

概要

強制的なラップ解除は、アクション通常のオプションで行われます。

暗黙的にアンラップされたオプションオプションです。通常はクラスの初期化に使用され、感嘆符なしで値を渡します使用されるとき。

質問

私は正しいですか?私の理解が正確でない場合、私を修正していただければ幸いです。

ありがとう

24
SLN

まずはOptionalを定義しましょう

オプションの値は、あるタイプ(IntStringUIColor、。)のcontainerです。 ..)、値(_1_、_"Hello world"_、.greenColor()、...)またはnilを含めることができます。

_let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
_

enter image description here

Swiftの場合、オプション値が表示されます。

OKこれには実際の値またはnilを含めることができます

強制的にアンラッピング

これは、Optional内に含まれる値をextractingするアクションです。コンパイラーに次のように伝えているため、この操作は危険です:このオプションの値には実際の値が含まれていると確信していますので、抽出してください!

_let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
_

anIntには値1が含まれるようになりました。

enter image description here

nilが含まれているOptional値で強制的にアンラップを実行すると、fatalErrorが取得され、アプリはクラッシュし、回復する方法はありません。

_let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!

fatal error: unexpectedly found nil while unwrapping an Optional value
_

enter image description here

暗黙的にアンラップされたオプション

暗黙的にアンラップされたオプションを定義するとき、読み取るたびに強制的にアンラップするautomaticallyコンテナーを定義します。

_var text: String! = "Hello"
_

今ならtextと読む

_let name = text
_

オプションのStringは取得しませんが、Stringはコンテンツを自動的にアンラップするため、プレーンtextを取得します。

ただし、テキストはオプションなので、nil値をその中に入れることができます

_text = nil
_

しかし、それを読むとすぐに(そしてnilを含む)、nilを含むオプションをアンラップしているため、致命的なエラーが発生します

_let anotherName = text

fatal error: unexpectedly found nil while unwrapping an Optional value
_
73
Luca Angeletti

暗黙的にアンラップされたオプションは、舞台裏で通常のオプションですが、オプションではない値のように使用することもできますので、はいcorrectです。

ただし、値を暗黙的にラップ解除として宣言すると、使用するたびに強制的にラップ解除することになります。

暗黙的にラップされていないオプションの場合、主な理由は4つあります。

1:初期化中に定義できない定数

2:Objective-C APIとの対話

3:アプリがnilである変数から回復できない場合

4:NSObject初期化子

5
Tarvo Mäesepp

いいえ、あなたは間違った区別を描いています:

  • 前半は正しいです。展開は確かにOptionalsに対して行うことであり、強制的な展開はそれを行う方法です(安全でない方法)。

  • しかし、暗黙的にアンラップされたオプションとは、強制的にアンラップが行われるように、オプションのタイプをマークする方法ですforあなた(それができない場所でオプションを使用する場合使用されますが、ラップ解除されていれば使用できます)。

2
matt