!
オプションに が含まれている場合に実行時例外が発生するため、一般に、( operator を使用して) オプションを強制的にアンラップすることは避ける必要がありますnil
。以下は、オプションのアンラップを処理するためのいくつかのテクニックに従います。
オプションのバインディング
ラップを解除して別のオプションではない変数に同じ固有の型に割り当てる場合、「一度ラップを解除してから複数回使用する」ことができる唯一の方法であることに注意してください。
オプションのバインディングを使用すると、次のようになります。
/* Example setup */
let display: UILabel = UILabel()
let digit = "1"
/* optional binding using if-let:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
if let unwrappedText = display.text {
// 'unwrapped' resides in scope inside of the if-let block
display.text = unwrappedText + digit
}
else {
display.text = digit
}
/* optional binding using guard-let-else:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
func foo(disp: UILabel, _ dig: String) {
guard let unwrappedText = display.text else {
display.text = digit
return
}
// 'unwrapped' resides in scope outside of the guard-let-else block
display.text = unwrappedText + digit
}
foo(display, digit)
Nil 合体演算子
条件付きバインディングを使用してラップされていない値を明示的に割り当てたくない場合は、安全なラップ解除のためにnil 合体演算子を利用できます。
/* nil coalescing operator */
display.text = (display.text ?? "") + digit
ただし、nil 合体演算子を準オプション バインディングの方法で使用できます。オプションがnilの場合、オプションのラップされていない値またはデフォルト値を割り当てます。
let metaUnwrapped = display.text ?? ""
ImmutablemetaUnwrapped
はそのスコープ内で利用可能であり、 (代入時) の値display.text
(非代入の場合) を含み、代入時のデフォルト値 (代入時)を含みnil
ます。上記のオプションのバインディングの例では、immutable と同じ方法で使用できます。""
display.text
nil
metaUnwrapped
unwrapped
display.text = metaUnwrapped + digit
オプションの連鎖
これはあなたの質問とは少しずれていますが、オプションとアンラップの主題であるため、オプションのチェーンについて言及することもできます。
オプションのチェーンは、オプションのプロパティが ではない場合、一部のオプションのプロパティのプロパティにアクセスするために使用できますnil
。例として、 の文字数を数えたいとしますdisplay.text
が、当然のことながらオプションの.text
プロパティが non-の場合のみですnil
。この場合、nil 合体演算子と組み合わせたオプションの連鎖が適切な選択方法になる可能性があります。
let numCharacters = display.text?.characters.count ?? 0
/* if text != nil, returns character count; otherwise, by
nil coalescing operator, returns 0 /*