最初は、強制的なアンラップと暗黙的なアンラップについて非常に混乱していました。今、私の自習から次の理解が得られました。
noアクションは暗黙的なアンラップに使用できますが、暗黙的にアンラップされたオプションと呼ばれるものがあります。暗黙的にアンラップされたオプションと通常のオプションはどちらもオプションです。暗黙的にアンラップされたオプションにアクセスするときの違いは、ボンネットの下に有効な値があり、すぐに使用できることです。通常のオプションにはif let
bindingまたは強制的なアンラッピング(!
)actionオプション変数の背後にある可能な値にアクセスします。
概要:
強制的なラップ解除は、アクション通常のオプションで行われます。
暗黙的にアンラップされたオプションはオプションです。通常はクラスの初期化に使用され、感嘆符なしで値を渡します使用されるとき。
質問:
私は正しいですか?私の理解が正確でない場合、私を修正していただければ幸いです。
ありがとう
オプションの値は、あるタイプ(Int
、String
、UIColor
、。)のcontainerです。 ..)、値(_1
_、_"Hello world"
_、.greenColor()
、...)またはnil
を含めることができます。
_let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
_
Swiftの場合、オプション値が表示されます。
OKこれには実際の値または
nil
を含めることができます
これは、Optional
内に含まれる値をextractingするアクションです。コンパイラーに次のように伝えているため、この操作は危険です:このオプションの値には実際の値が含まれていると確信していますので、抽出してください!
_let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
_
anInt
には値1が含まれるようになりました。
nil
が含まれているOptional値で強制的にアンラップを実行すると、fatalError
が取得され、アプリはクラッシュし、回復する方法はありません。
_let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!
fatal error: unexpectedly found nil while unwrapping an Optional value
_
暗黙的にアンラップされたオプションを定義するとき、読み取るたびに強制的にアンラップする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
_
暗黙的にアンラップされたオプションは、舞台裏で通常のオプションですが、オプションではない値のように使用することもできますので、はいcorrectです。
ただし、値を暗黙的にラップ解除として宣言すると、使用するたびに強制的にラップ解除することになります。
暗黙的にラップされていないオプションの場合、主な理由は4つあります。
1:初期化中に定義できない定数
2:Objective-C APIとの対話
3:アプリがnil
である変数から回復できない場合
4:NSObject
初期化子
いいえ、あなたは間違った区別を描いています:
前半は正しいです。展開は確かにOptionalsに対して行うことであり、強制的な展開はそれを行う方法です(安全でない方法)。
しかし、暗黙的にアンラップされたオプションとは、強制的にアンラップが行われるように、オプションのタイプをマークする方法ですforあなた(それができない場所でオプションを使用する場合使用されますが、ラップ解除されていれば使用できます)。