Skip to content

Commit e3e9a8d

Browse files
authored
Merge pull request #634 from stzn/if-case
[制御フロー、列挙型]if-caseとfor-caseのガイドを追加
2 parents 1b93614 + 0781d50 commit e3e9a8d

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-5
lines changed

language-guide/control-flow.md

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 制御フロー\(Control Flow\)
22

3-
最終更新日: 2024/6/23
3+
最終更新日: 2025/6/21
44
原文: https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
55

66
分岐、ループ、および早期終了を使ってコードを構造化する。
@@ -616,6 +616,59 @@ default:
616616

617617
上記のケースでは 2 つのパターンを含んでいます: `(let distance, 0)` は x 軸上にある点に合致し、`(0, let distance)` は y 軸上にある点に合致します。どちらのパターンでも、`distance` へのバインディングが含まれており、どちらも数値です。つまり、ケース内では常に `distance` にアクセスできます。
618618

619+
## <a id="patterns">パターン\(Patterns\)</a>
620+
621+
これまでの例では、それぞれの `switch``case` に、その `case` にマッチする値を示すパターンが含まれていました。`if` 文の条件式としてもパターンを使うことができます。次のようになります。
622+
623+
```swift
624+
let somePoint = (12, 100)
625+
if case (let x, 100) = somePoint {
626+
print("y=100線上に点\(x)を発見")
627+
}
628+
// "y=100線上に点12を発見" と出力
629+
```
630+
631+
このコードでは、`if` 文の条件式が `case` で始まっていますが、これは条件がブール値ではなくパターンであることを示しています。パターンがマッチした場合、`if` の条件は `true` と見なされ、`if` 文本体のコードが実行されます。`if case` の後に記述できるパターンは、`switch``case` で記述できるパターンと同じです。
632+
633+
`for-in` ループでは、コードに `case` を書かなくても、値をバインドするパターンを使って値の各部分に名前を付けることができます。
634+
635+
```swift
636+
let points = [(10, 0), (30, -30), (-20, 0)]
637+
638+
for (x, y) in points {
639+
if y == 0 {
640+
print("x軸上に点\(x)を発見")
641+
}
642+
}
643+
// "x軸上に点10を発見" と出力
644+
// "x軸上に点-20を発見" と出力
645+
```
646+
647+
上記の `for-in` ループはタプルの配列をイテレートし、タプルの 1 番目と 2 番目の要素を定数 `x``y` にバインドします。ループ内の文では、点が x 軸上にあるかどうかをチェックする `if` 文のように、これらの定数を使用できます。このコードをより簡潔に書くには、`for-case-in` ループを使って値のバインドと条件を組み合わせます。以下のコードは、上記の `for-in` ループと同じ動作をします。
648+
649+
```swift
650+
for case (let x, 0) in points {
651+
print("x軸上に点\(x)を発見")
652+
}
653+
// "x軸上に点10を発見" と出力
654+
// "x軸上に点-20を発見" と出力
655+
```
656+
657+
このコードでは、条件がパターンの一部として `for-case-in` ループに統合されています。`for-case-in` ループ内の文は、x 軸上の点に対してのみ実行されます。このコードは上記の `for-in` ループと同じ結果を生成しますが、コレクション内の特定の要素だけをイテレートするための、よりコンパクトな方法です。
658+
659+
`for-case-in` ループには、追加の条件をチェックするために `where` 節を含めることもできます。ループ内の文は、`where` 節が現在の要素に対して `true` である場合にのみ実行されます。例えば、次のようになります。
660+
661+
```swift
662+
for case let (x, y) in points where x == y || x == -y {
663+
print("原点を通る直線上に (\(x), \(y)) を発見")
664+
}
665+
// "原点を通る直線上に (30, -30) を発見" と出力
666+
```
667+
668+
このコードは、タプルの 1 番目と 2 番目の要素を定数 `x``y` にバインドし、`where` 節でそれらの値をチェックします。`where` 節が `true` の場合、`for` ループの本体のコードが実行されます。そうでなければ、イテレーションは次の要素へと続きます。
669+
670+
パターンは値をバインドできるため、`if-case` 文と `for-case-in` ループは、[関連値\(Associated Values\)](./enumerations.md#associated-values) で説明されているように、関連値を持つ列挙型を扱うのに便利です。
671+
619672
## <a id="control-flow-control-transfer-statements">制御転送文\(Control Transfer Statements\)</a>
620673

621674
_制御転送文_は、コードの一部の制御を他の部分へ転送させることで、コードの実行順序を変更します。Swift には 5 つの制御転送文があります:

language-guide/enumerations.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 列挙型\(Enumerations\)
22

3-
最終更新日: 2023/9/17
3+
最終更新日: 2025/6/21
44
原文: https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
55

66
可能な値のリストを定義する独自の型をモデル化する。
@@ -200,9 +200,19 @@ case let .qrCode(productCode):
200200
// QR code: ABCDEFGHIJKLMNOP.
201201
```
202202

203+
列挙型の単一のケースにのみ一致させる場合、例えばその関連値を抽出するようなときには、完全な `switch` 文を記述する代わりに `if-case` 文を使用できます。例は次の通りです。
204+
205+
```swift
206+
if case .qrCode(let productCode) = productBarcode {
207+
print("QR code: \(productCode).")
208+
}
209+
```
210+
211+
先述の `switch` 文と同様に、ここでは `productBarcode` 変数がパターン `.qrCode(let productCode)` とマッチングされます。そして `switch``case` と同様に、`let` を記述すると関連値が定数として抽出されます。`if-case` 文についての詳細は、[パターン\(Patterns\)](./control-flow.md#patterns) を参照してください。
212+
203213
## Raw Values
204214

205-
[Associated Values\(関連値\)](enumerations.md#associated-values)のバーコードの例は、列挙ケースが、様々な型に関連値を格納して宣言する方法を示しています。関連値の代わりに、列挙型には、全て同じ型のデフォルト値\(_Raw Values_と呼ばれる\)を事前に定義することもできます。
215+
[関連値\(Associated Values\)](enumerations.md#associated-values)のバーコードの例は、列挙ケースが、様々な型に関連値を格納して宣言する方法を示しています。関連値の代わりに、列挙型には、全て同じ型のデフォルト値\(_Raw Values_と呼ばれる\)を事前に定義することもできます。
206216

207217
名前付きの列挙ケースと一緒に ASCII 値を格納する例を次に示します。
208218

@@ -218,8 +228,7 @@ enum ASCIIControlCharacter: Character {
218228

219229
Raw Value は、文字列、文字、または整数型または浮動小数点数型のいずれかです。各 Raw Value は、その列挙型内で一意でなければなりません。
220230

221-
> NOTE
222-
> Raw Valueは、関連値と同じではありません。上記の3つの ASCII コードのように、コードで列挙型を最初に定義するときに、Raw Value は事前入力された値に設定されます。特定の列挙ケースの Raw Value は常に同じです。関連値は、列挙ケースに基づいて新しい定数または変数を作成するときに設定され、作成する度に異なる可能性があります。
231+
Raw Value と関連値は、どちらも列挙型に追加の値を設定するために使用できますが、両者の違いを理解しておくことが重要です。Raw Value は、上記の 3 つの ASCII コードのように、コード内で列挙型のケースを定義する際に設定します。特定の列挙型のケースに設定した Raw Value は、常に同じ値です。一方、関連値は、列挙型のいずれかのケースを使用して新しい定数または変数を作成する際に設定するもので、そのたびに異なる値を選択できます。
223232

224233
### <a id="implicitly-assigned-raw-values">暗黙的に割り当てられたRaw Value\(Implicitly Assigned Raw Values\)</a>
225234

0 commit comments

Comments
 (0)