【Swift】条件分岐文まとめ

#はじめに
この記事には、Swiftで多用する条件分岐文についてまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考文献
この記事は以下の情報を参考にして執筆しました。

- [Swift実践入門](https://www.amazon.co.jp/%EF%BC%BB%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%EF%BC%BDSwift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-WEB-PRESS-plus-ebook/dp/B086VVQ3DJ/ref=sr_1_1?adgrpid=56053864951&dchild=1&gclid=CjwKCAiAo5qABhBdEiwAOtGmbtEdp97n9eQCgn4VQpffZut8DhCnND9sXQBMoTecHwls0LKIy4l-cxoCCZwQAvD_BwE&hvadid=338518511220&hvdev=c&hvlocphy=1009155&hvnetw=g&hvqmt=e&hvrand=13959960213026669174&hvtargid=kwd-306987067810&hydadcr=27263_11561109&jp-ad-ap=0&keywords=swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1611048736&sr=8-1&tag=googhydr-22)


#目次
1. if文 - 条件の成否による分岐
2. guard文 - 条件不成立時に早期退出する分岐
3. switch文 - 複数のパターンマッチによる分岐


#1. if文 - 条件の成否による分岐
条件の成否に応じて実行する文を切り替える制御構文。
Bool型の値を返す条件式と、それに続く{}で囲まれた実行文から構成される。
条件式がtrueを返す場合は{}内の文が実行され、条件式がfalseを返す場合は{}内の文の実行がスキップされる。

```if 条件式 {
条件式がtrueの場合に実行される文
}
```

####-else節 - 条件不成立時の処理
条件が不成立の時、実行させたい文がある場合使用する。
if文の{}のあとにelseキーワードと{}に囲まれた文を続ける。

```if 条件式 {
条件がtrueの場合に実行される文
} else {
条件式がfalseの場合に実行される文
}
```

また、else節は他のif文をつなげて書くこともできる。

```if 条件式1 {
条件式1がtrueの場合に実行される文
} else if 条件式2 {
条件式1がfalseかつ条件式2がtrueの場合に実行される文
} else {
条件式1と条件式2の両方がfalseの場合に実行される文
}
```

####-if-let文 - 値の有無による分岐
オプショナルバインディングを行う条件分岐文。
optional<Wrapped>型の値の有無に応じて分岐を行い、値が存在する場合は値の取り出しも同時に行う。
以下のように、optional<Wrapped>型の値を右辺に持つ定数定義を条件式に記述する。
右辺の値が存在する場合のみ{}内の文を実行し、nilの場合は{}内の文の実行をスキップする。
nilの場合のみ実行する文を追加するには、if文と同様にelse節を追加する。

```if let 定数名 = optional<Wrapped>型の値 {
値が存在する場合に実行される文
} else {
値が存在しない場合に実行される文
}
```

また、if-let文では、複数のoptional<Wrapped>型の値を同時に取り出すこともできる。
この場合、すべての右辺が値を持っていた場合のみ、if文の実行文が実行される。


#2. guard文 - 条件不成立時に早期退出する分岐
条件不成立時に早期退出を行うための条件分岐文。
guardキーワード、条件式、elseキーワード、そして{}で囲まれた文から構成される。
条件式がfalseを返す場合のみ{}内の文を実行し、条件式がtrueを返す場合は{}内の文の実行をスキップする。
guard文のelse節では、guard文が含まれるスコープから退出しなければならない。
よって、guard文のelse節以降ではguard文の条件式が必ず成り立っていることがコンパイル時に保証される。
なお、guard文を含むスコープからの退出が含まれない場合、コンパイルエラーとなる。

```guard 条件式 else {
条件式がfalseの場合に実行される文
guard文が記述されているスコープの外に退出する必要がある
}
```

また、guard文でもguard-let文として利用できる。
guard-let文とif-let文の違いは、guard-let文で宣言された変数や定数は、guard-let文以降で利用可能という点。
これは、条件式が満たされなかった場合にはスコープから出るため、guard文以降で変数や定数の存在が保証されるため。


#3. switch文 - 複数のパターンマッチによる分岐
パターンを利用して制御式の値に応じて実行文を切り替える制御構文。
switch文の制御式にはどのような型の値でも指定できる。
switch文では制御式がパターンとマッチするかを上から順に評価し、マッチしたパターンの実行文が実行される。
一度マッチして実行するとマッチングは終了し、それ以降のパターンはスキップされる。
switch文の各パターンはcaseキーワードで定義し、どのパターンにもマッチしなかった場合の実行文はdefaultキーワードでデフォルトケースとして定義する。

```switch 制御式 {
case パターン1:
制御式がパターン1にマッチした場合に実行される文
case パターン2:
制御式がパターン2にマッチした場合に実行される文
default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文
}
```

また、ケースが網羅されていないとコンパイルエラーになる。
なので、制御式が取り得るすべての値をいずれかのケースにマッチさせる必要がある。

####defaultキーワード - デフォルトケースによる網羅性の保証
他のいずれのケースにもマッチしない場合マッチするケースで、defaultキーワードで定義する。
デフォルトケースが存在すればマッチしないケースは存在しなくなるため、デフォルトケースは網羅性を保証する役割を担っている。
ただし、列挙型の制御式に対してデフォルトケースを用意することは極力避け、個々のケースを列挙する方が好ましい。

####whereキーワード - ケースにマッチする条件の追加
ケースにマッチする条件を追加できる。

```switch 制御式 {
case パターン where 条件式:
制御式がパターンにマッチし、かつ、条件式を満たす場合に実行される文
default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文
}
```

####break文 - ケースの実行の中断
switch文のケースの実行を中断する文。
breakキーワードのみか、breakキーワードと後述するラベルの組み合わせで構成される。

####ラベル
break文の制御対象を指定するための仕組み。
break文の対象となるswitch文を明示する必要があるケースで利用する。
ラベルによってswitch文を参照可能にするには、break文の前にラベル名:を追加する。

```ラベル名: switch文
```

breakキーワードに続けてラベル名を追加することで、対象のswitch文を明示。

```break ラベル名
```

####fallthrough文
switch文のケースの実行を終了し、次のケースを実行する制御構文。
fallthrough文は、fallthroughキーワードのみで構成される。