オプションは設定されているか設定されていないか(nilまたはnilではない)...重要な決定を私たちに残します。「2つの両方の状態で正しく機能するように、コードをどのように作成する必要がありますか?」オプションをアンラップする方法は、私たちにとってそれを決定するものです。
設定されていないオプションに対抗するために使用できるいくつかのアプローチがあります。
- クラッシュ!
- 値が設定されていない場合は、デフォルトで値を設定します。
- 優雅つまりは何もしない失敗するだけでなく、場合値が設定された、それを割り当てます。
- 優雅つまりしかし、何もしない失敗した場合(それだけでより多くの単一代入以上です)値が設定された...何かをします。
以下は4つのアプローチです
値がない場合、強制アンラップを使用するとクラッシュします。その値を持つことが非常に重要である場合、たとえば映画のタイトル(すべての映画には名前が必要です)の場合は、これを実行する必要があります。強制アンラップに使用されます。!
movieTitle = movie.title!
nil合体を使用することは、より詳細な制御を提供するもう1つの方法です。つまり、値が設定されていなくてもクラッシュせず、設定されていない場合は「何も設定されません」...指示どおりに実行されます。たとえば、名前が設定されていない場合、映画の名前はデフォルトでuntitled_movieに設定されます。??
ヌル合体に使用されます。
var movieTitle = movie.title ?? "untitled_Movie"
オプションのチェーンを使用しても、値がない場合は何も実行されず、値がある場合は値が設定されます。これは、値を設定することが非常に重要ではないもの、たとえば俳優のエージェントの名前に対して行います。?
オプションのチェーンに使用されます。
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
使用するif-let
(またはguard
二つの異なるタイプである結合オプション)はあなたを与えるだろうより多くのコントロールが値が設定されていない場合は、それがクラッシュすることはありません。値が設定されている場合は、何かを行うことができます。設定されていない場合は、else
ステートメントを追加できます。
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
強制的なアンラップはやや推奨されないため、これは最も一般的に使用されるアンラップの方法です。推奨されない理由の詳細については、こちらを参照してください。間の良好な比較のためguard
とif-let
見guard vs. if-let
サイドノート:
オプションのバインディングとオプションのチェーンは、一般的に一緒に使用されます。
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}