|
1 | 1 | # 制御フロー\(Control Flow\)
|
2 | 2 |
|
3 |
| -最終更新日: 2024/6/23 |
| 3 | +最終更新日: 2025/6/21 |
4 | 4 | 原文: https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
|
5 | 5 |
|
6 | 6 | 分岐、ループ、および早期終了を使ってコードを構造化する。
|
@@ -616,6 +616,59 @@ default:
|
616 | 616 |
|
617 | 617 | 上記のケースでは 2 つのパターンを含んでいます: `(let distance, 0)` は x 軸上にある点に合致し、`(0, let distance)` は y 軸上にある点に合致します。どちらのパターンでも、`distance` へのバインディングが含まれており、どちらも数値です。つまり、ケース内では常に `distance` にアクセスできます。
|
618 | 618 |
|
| 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 | + |
619 | 672 | ## <a id="control-flow-control-transfer-statements">制御転送文\(Control Transfer Statements\)</a>
|
620 | 673 |
|
621 | 674 | _制御転送文_は、コードの一部の制御を他の部分へ転送させることで、コードの実行順序を変更します。Swift には 5 つの制御転送文があります:
|
|
0 commit comments