29

最初は、強制的なアンラップと暗黙的なアンラップについて非常に混乱していました。さて、以下の理解は私の独学から得られます。

暗黙的なアンラップに使用できるアクションはありませんが、暗黙的にアンラップされたオプションと呼ばれるものがあります。暗黙的にラップ解除された Optional と通常の Optional はどちらも Optional です。違いは、暗黙的にラップ解除された Optional にアクセスする場合、フードの下に有効な値があり、すぐに使用できることを自信を持って知ることができます。通常のオプションは、オプション変数の背後にある可能な値にアクセスするために、 if letバインディングまたは強制アンラップ ( !) アクションを必要とします。

まとめ

強制アンラップは、通常の Optional に対して実行されるアクションです。

暗黙的にアンラップされた OptionalOptionalであり、通常はクラスの初期化に使用され、使用時に感嘆符なしで値を渡します。

質問:

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

ありがとう

4

4 に答える 4

88

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

Optional 値は、何らかのタイプ ( 、、 、...) のコンテナーであり、値 ( 、、、...) またはを含むことができます。IntStringUIColor1"Hello world".greenColor()nil

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

ここに画像の説明を入力

Swift で Optional 値が表示されると、次のように考えます。

これには実際の値またはnil

強制アンラップ

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

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

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

ここに画像の説明を入力

を含む Optional 値に対して強制アンラップを実行するnilfatalError、アプリがクラッシュし、回復する方法がありません。

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

fatal error: unexpectedly found nil while unwrapping an Optional value

ここに画像の説明を入力

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

Implicitly unwrapped オプションを定義するとき、それを読み取るたびに自動的に強制アンラップを実行するコンテナーを定義します。

var text: String! = "Hello"

今私たちが読んだらtext

let name = text

Optional は取得しませんが、コンテンツのラップが自動的に解除されるためString、プレーンになります。Stringtext

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

text = nil

しかし、それを読むとすぐに(そして含まれているnil)致命的なエラーが発生します。nil

let anotherName = text

fatal error: unexpectedly found nil while unwrapping an Optional value
于 2016-08-07T19:27:19.283 に答える