Swiftの「switch」文で整数範囲と数値パターンをマッチングする方法

Swiftの「switch」文は、条件分岐を直感的かつ簡潔に記述できる強力な機能の一つです。特に、整数や数値パターンに対して使うことで、複雑な条件を読みやすく整理することができます。C言語やJavaといった他のプログラミング言語にも「switch」文はありますが、Swiftの「switch」はその柔軟性と機能の豊富さで際立っています。この記事では、整数範囲や数値パターンに対するマッチング方法を、Swiftの「switch」文を用いて詳しく解説し、開発現場でも役立つ具体例を紹介します。

目次
  1. switch文の基本構造
    1. breakが不要な理由
  2. パターンマッチングの概要
    1. 複数のパターンに対するマッチング
    2. パターンマッチングの範囲
  3. 範囲演算子を使った整数のマッチング
    1. 閉区間演算子 (`…`)
    2. 半開区間演算子 (`..<`)
    3. 範囲演算子の応用
  4. 値のリストを使ったマッチング
    1. 複数の値を指定する方法
    2. 整数以外のリストでの使用例
    3. メリットと活用シーン
  5. ワイルドカードパターンの使用
    1. ワイルドカードの基本
    2. パターンを無視するワイルドカード
    3. defaultとの違い
  6. guard文との組み合わせ
    1. guard文の基本
    2. guard文とswitch文を組み合わせる
    3. guard文の利点
    4. 使用シーン
  7. パターンマッチングの応用例
    1. タプルを使ったパターンマッチング
    2. オプショナル型のパターンマッチング
    3. where句を使った条件付きパターンマッチング
    4. 列挙型(enum)との組み合わせ
    5. 実践での応用
  8. 数値以外のデータ型でのマッチング
    1. 文字列を使ったマッチング
    2. オプショナル型のマッチング
    3. 配列を使ったマッチング
    4. 列挙型を使ったマッチング
    5. 複雑なデータ型へのマッチング
    6. まとめ
  9. パフォーマンスの考慮
    1. 条件の順序と最適化
    2. 範囲演算子の使い方
    3. 列挙型の最適化
    4. guard文や早期リターンを活用した最適化
    5. switch文とif文の選択
    6. まとめ
  10. 練習問題
    1. 練習問題1: 整数の範囲マッチング
    2. 練習問題2: 値のリストを使ったマッチング
    3. 練習問題3: オプショナル型のマッチング
    4. 練習問題4: 列挙型のマッチング
    5. 練習問題5: where句を使った条件付きマッチング
  11. まとめ

switch文の基本構造

Swiftにおける「switch」文は、他のプログラミング言語と同様に、特定の値に基づいて異なる処理を実行するための条件分岐構文です。Swiftでは「switch」文が非常に柔軟で、単純な値の比較だけでなく、さまざまなパターンマッチングが可能です。

基本的な構造は以下の通りです。

let value = 3

switch value {
case 1:
    print("値は1です")
case 2:
    print("値は2です")
case 3:
    print("値は3です")
default:
    print("その他の値です")
}

breakが不要な理由

他の言語と異なり、Swiftの「switch」文では各ケースの末尾に「break」を書く必要がありません。Swiftでは各ケースが自動的にブロック終了時に処理を抜けるため、誤って次のケースに進む「フォールスルー」が発生しません。このため、より安全で読みやすいコードを書くことができます。

パターンマッチングの概要

パターンマッチングとは、特定の条件やパターンに基づいてデータを処理するための方法です。Swiftの「switch」文では、単純な数値の一致だけでなく、さまざまな複雑なパターンに対してマッチングを行うことができます。これにより、条件分岐をより柔軟かつ強力に制御できます。

複数のパターンに対するマッチング

Swiftの「switch」文では、1つのケースに対して複数の値や条件をまとめて指定できます。これにより、同じ処理を複数の条件で実行したい場合にも簡潔なコードを記述できます。

let value = 2

switch value {
case 1, 2, 3:
    print("値は1から3のいずれかです")
default:
    print("それ以外の値です")
}

このように、複数のパターンをカンマで区切って書くことで、コードが非常にシンプルになります。

パターンマッチングの範囲

Swiftの「switch」文では、数値の一致に加えて、範囲(Range)や条件付きのパターン(where句)を使った高度なマッチングも可能です。これにより、条件分岐がさらに柔軟になります。

let value = 10

switch value {
case 1...5:
    print("値は1から5の範囲内です")
case 6...10:
    print("値は6から10の範囲内です")
default:
    print("それ以外の値です")
}

このように、Swiftではパターンマッチングを駆使して、複雑な条件でも可読性を損なわないコードを書くことが可能です。

範囲演算子を使った整数のマッチング

Swiftの「switch」文では、範囲演算子(.....<)を使って、整数の範囲に基づく条件分岐が簡単に行えます。特に、数値の範囲を柔軟に指定することで、複雑な条件でも可読性を保ちながら効率的に処理を行うことができます。

閉区間演算子 (`…`)

閉区間演算子 ... は、指定された範囲の端点を含む範囲を定義します。例えば、1...5 と記述すると、1から5までのすべての整数がマッチします。

let score = 85

switch score {
case 0...59:
    print("成績は不合格です")
case 60...79:
    print("成績は合格です")
case 80...100:
    print("成績は優秀です")
default:
    print("無効なスコアです")
}

この例では、スコアが60から79の範囲にある場合は「合格」、80から100の場合は「優秀」という具合に処理されています。

半開区間演算子 (`..<`)

一方、半開区間演算子 ..< は、上限を含まない範囲を定義します。例えば、1..<5 と記述すると、1から4までの整数がマッチし、5は含まれません。

let age = 18

switch age {
case 0..<13:
    print("子供です")
case 13..<20:
    print("ティーンエイジャーです")
case 20..<65:
    print("大人です")
default:
    print("高齢者です")
}

この例では、13..<20 という範囲指定により、13歳から19歳のティーンエイジャーが処理対象になります。半開区間演算子を使うことで、特定の範囲を細かくコントロールできるのが特徴です。

範囲演算子の応用

このように、範囲演算子を使った「switch」文は、特に数値の連続した範囲を処理する際に非常に有用です。また、コードの見通しを良くし、複雑な条件分岐を簡潔に表現できるため、日常のプログラムだけでなく、テストやデータバリデーションにも幅広く応用できます。

値のリストを使ったマッチング

Swiftの「switch」文では、複数の値に対して一度にマッチングを行うことができます。この機能を使うと、特定の値のリストに対して同じ処理を行いたい場合に非常に便利です。複数の値をカンマで区切って1つのcaseにまとめることで、複雑な条件分岐をよりシンプルに記述できます。

複数の値を指定する方法

複数の値に対して1つの処理を行いたい場合、case文にカンマで区切った値を指定します。これにより、同じ処理を複数の値に対して行うことが可能になります。

let dayOfWeek = 6

switch dayOfWeek {
case 1, 7:
    print("週末です")
case 2, 3, 4, 5, 6:
    print("平日です")
default:
    print("無効な日です")
}

この例では、1と7(つまり日曜日と土曜日)のどちらであっても「週末です」という処理が実行され、2から6のいずれかの場合には「平日です」と出力されます。

整数以外のリストでの使用例

この複数の値をマッチングする方法は、整数に限らず、他のデータ型でも使うことができます。たとえば、文字列に対しても同様の記法を適用できます。

let fruit = "Apple"

switch fruit {
case "Apple", "Banana", "Orange":
    print("フルーツです")
case "Carrot", "Potato":
    print("野菜です")
default:
    print("その他です")
}

この例では、指定した複数の果物に対して「フルーツです」という処理が実行されます。複数の値をカンマで区切ることで、条件ごとにまとめた処理が簡単に行えるようになります。

メリットと活用シーン

値のリストを使ったマッチングは、たとえばUI上の複数のボタンが押された際の処理や、複数の特定のエラーコードに対して同じエラーハンドリングを行うといった場面で有効です。この方法を活用することで、重複するコードを減らし、シンプルで見やすい条件分岐を実現することができます。

ワイルドカードパターンの使用

Swiftの「switch」文では、ワイルドカードパターン(_)を使って、特定の条件に合わないすべてのケースをまとめて処理することができます。これにより、特定の値には興味がない、あるいはすべての値を受け入れるといった柔軟な条件分岐が可能となります。

ワイルドカードの基本

ワイルドカードパターンは、値を無視したい場合に使用します。_は「どんな値でも構わない」という意味を持ち、ケース内で値を特に使用しない場合に便利です。

let statusCode = 404

switch statusCode {
case 200:
    print("成功")
case 400:
    print("不正なリクエスト")
case 404:
    print("ページが見つかりません")
case _:
    print("その他のステータスコード")
}

この例では、特定のステータスコード以外のすべての値を受け入れ、「その他のステータスコード」として処理します。_を使うことで、すべての未定義のケースを網羅できるため、全てのケースに対応する必要があるswitch文において重要な役割を果たします。

パターンを無視するワイルドカード

_はまた、パターンの一部を無視したい場合にも使われます。たとえば、特定の範囲や条件の中で、部分的に値を無視して処理を行いたいケースに便利です。

let coordinates = (x: 10, y: 5)

switch coordinates {
case (0, 0):
    print("原点です")
case (_, 0):
    print("x軸上にあります")
case (0, _):
    print("y軸上にあります")
case (_, _):
    print("どこか別の場所にあります")
}

この例では、_を使って、x軸やy軸の値を無視し、特定の条件をもとに処理を行っています。例えば、(_, 0)のパターンではx座標を無視し、y座標が0であれば「x軸上にあります」と出力されます。

defaultとの違い

ワイルドカードパターン_defaultケースの違いは、_が他のcase内で使用できる点にあります。一方で、defaultは「switch」文全体の最後のケースとして使用されるため、他のケースでのパターンマッチングの補完役を果たします。

let grade = "C"

switch grade {
case "A", "B":
    print("合格です")
case _:
    print("その他の成績です")
}

このように、ワイルドカードパターンは、特定のパターンに対する柔軟な処理を行う際に非常に便利です。特に、全ての可能性を網羅する必要がある場合や、特定の値を無視したい場合に重宝されます。

guard文との組み合わせ

Swiftの「switch」文は、他の制御構文と組み合わせることでさらに柔軟性が増します。特に「guard」文と組み合わせることで、条件が満たされない場合に早期に処理を中断するロジックを簡潔に記述できます。「guard」文を使用すると、複雑な条件分岐を回避しつつ、コードの可読性を向上させることができます。

guard文の基本

「guard」文は、条件が満たされない場合にすぐに処理を中断して、後続のコードを実行しないようにする構文です。通常、elseブロックと共に使用され、条件が成立しない場合には早期に関数や処理の終了が行われます。

func processGrade(grade: Int?) {
    guard let grade = grade, grade >= 0 else {
        print("無効な成績です")
        return
    }
    print("成績は \(grade) です")
}

この例では、gradeがnilであるか0未満の場合に早期に関数を終了し、gradeが有効な場合のみ後続の処理が実行されます。

guard文とswitch文を組み合わせる

「switch」文と「guard」文を組み合わせることで、条件が満たされない場合には早期に処理を抜け、特定のケースに対してのみ処理を行うことができます。これにより、複雑な条件分岐が簡潔になり、処理のフローが明確になります。

func checkScore(score: Int?) {
    guard let score = score, score >= 0 else {
        print("無効なスコアです")
        return
    }

    switch score {
    case 0...59:
        print("不合格です")
    case 60...79:
        print("合格です")
    case 80...100:
        print("優秀です")
    default:
        print("スコアが範囲外です")
    }
}

この例では、guard文でまずscoreがnilでないこと、かつ0以上であることをチェックしています。無効な場合は処理を終了し、有効なスコアが得られた場合にのみ「switch」文が実行され、スコアに応じた出力が行われます。

guard文の利点

「guard」文を使用することで、特定の条件が満たされなかった場合に即座に処理を中断できるため、ネストの深い条件分岐を避けることができます。これにより、コードの見通しがよくなり、可読性が向上します。特に、オプショナルのアンラップや不正な値のチェックを行う際に有効です。

使用シーン

「guard」文と「switch」文を組み合わせることで、たとえばユーザー入力の検証や、外部データのチェックを行う際に、条件に応じて早期にエラー処理を行い、必要な場合のみ複雑な処理を実行するという設計が容易にできます。このアプローチにより、エラー処理が明確になり、後続の処理が成功時にのみ実行される安全なコードを作成できます。

パターンマッチングの応用例

Swiftの「switch」文を使ったパターンマッチングは、単なる整数や数値の処理だけでなく、さまざまなデータ型や条件に基づいた高度な処理に応用することができます。ここでは、実際の開発現場で役立つパターンマッチングの応用例を紹介し、複雑なデータに対する効果的なマッチング方法を解説します。

タプルを使ったパターンマッチング

タプルは複数の値を一度に扱うことができ、Swiftの「switch」文と組み合わせると複雑な条件を一度に評価できます。例えば、2次元座標を処理する場合や、複数の関連データを同時に判定する場合に便利です。

let point = (x: 10, y: 0)

switch point {
case (0, 0):
    print("原点です")
case (let x, 0):
    print("x軸上にあります。xの値は \(x) です")
case (0, let y):
    print("y軸上にあります。yの値は \(y) です")
case let (x, y):
    print("x: \(x), y: \(y) の座標にあります")
}

この例では、タプルを使って2次元の座標に対するパターンマッチングを行っています。caseごとに異なる条件を持つため、原点、x軸上、y軸上、その他の座標といった複数のケースを効率よく処理できます。

オプショナル型のパターンマッチング

Swiftではオプショナル型(Optional)の値を持つことがよくありますが、「switch」文を使うことで、オプショナルのアンラップや値の有無に基づく処理を簡潔に記述できます。これにより、オプショナル型を安全に扱うことができます。

let name: String? = "John"

switch name {
case .some(let unwrappedName):
    print("名前は \(unwrappedName) です")
case .none:
    print("名前がありません")
}

このコードでは、オプショナル型の変数nameがnilでない場合に値をアンラップして処理を行い、nilの場合は別の処理を実行しています。.some.noneは、それぞれオプショナルが値を持つ場合と持たない場合を表しています。

where句を使った条件付きパターンマッチング

Swiftの「switch」文では、where句を使って追加の条件を指定することも可能です。これにより、より複雑な条件に基づいた処理を行うことができます。where句は、特定の条件が満たされたときにだけ処理を実行したい場合に非常に有効です。

let age = 25

switch age {
case let x where x < 18:
    print("未成年です")
case let x where x >= 18 && x < 65:
    print("成人です")
case let x where x >= 65:
    print("高齢者です")
default:
    print("無効な年齢です")
}

この例では、where句を使って年齢に基づいた条件分岐を行っています。switch文の各ケースで変数xが使われ、その値が特定の範囲にあるかどうかで処理が分岐します。

列挙型(enum)との組み合わせ

Swiftの「switch」文は列挙型(enum)との組み合わせでも非常に強力です。列挙型は、限られた数のケースを持つデータ型で、特定の状態やアクションを定義する際によく使われます。「switch」文を使うことで、列挙型の各ケースに対する処理を簡単に実装できます。

enum TrafficLight {
    case red, yellow, green
}

let signal = TrafficLight.red

switch signal {
case .red:
    print("止まってください")
case .yellow:
    print("注意してください")
case .green:
    print("進んでください")
}

この例では、信号の状態を表す列挙型TrafficLightを定義し、その状態に応じて「止まる」「注意」「進む」という異なる指示を出す処理を行っています。列挙型と「switch」文を組み合わせることで、状態の変化に対応するコードを簡潔に書くことができます。

実践での応用

パターンマッチングは、実践的なシナリオで非常に役立ちます。例えば、Web APIから取得した複雑なデータをパターンに基づいて処理する場合や、ユーザーインターフェースにおいて特定のイベントに対する応答を定義する際に有用です。これにより、複雑な条件を効率的に処理し、コードの品質と保守性が向上します。

このように、Swiftの「switch」文を活用したパターンマッチングは、さまざまなデータ型や状況に対応する強力なツールであり、効率的で柔軟なコードを書くための重要な技術です。

数値以外のデータ型でのマッチング

Swiftの「switch」文は、数値だけでなく、さまざまなデータ型に対してもパターンマッチングを行うことができます。特に、文字列やオプショナル、列挙型など、数値以外のデータ型に対しても柔軟に対応することができる点が大きな強みです。これにより、複雑な条件をより簡潔に処理することが可能になります。

文字列を使ったマッチング

文字列に対しても「switch」文を使用してマッチングが可能です。たとえば、文字列に基づいて異なる処理を行いたい場合、以下のようなコードを書けます。

let animal = "Dog"

switch animal {
case "Dog":
    print("犬です")
case "Cat":
    print("猫です")
case "Bird":
    print("鳥です")
default:
    print("未知の動物です")
}

この例では、変数animalが「Dog」である場合に「犬です」と出力されます。このように、文字列の値をもとにして異なる処理を簡単に行うことができます。

オプショナル型のマッチング

オプショナル型(Optional)はSwiftで広く使われる型であり、値が存在するかどうかを簡単に表現できます。「switch」文を使って、オプショナル型の値が存在するかどうかをマッチングすることができます。

let username: String? = "Alice"

switch username {
case .some(let name):
    print("ユーザー名は \(name) です")
case .none:
    print("ユーザー名が存在しません")
}

この例では、usernameがnilでなければsomeパターンで値をアンラップし、名前を出力します。もしusernameがnilの場合、noneケースが実行され「ユーザー名が存在しません」と表示されます。オプショナル型を扱う際に、このパターンマッチングは非常に役立ちます。

配列を使ったマッチング

配列も「switch」文で扱うことができ、要素数や特定のパターンに基づいて処理を分岐させることが可能です。例えば、配列の要素数に基づいて処理を分ける場合、次のように記述できます。

let numbers = [1, 2, 3]

switch numbers.count {
case 0:
    print("配列は空です")
case 1:
    print("配列に1つの要素があります")
case 2...5:
    print("配列には2から5の要素があります")
default:
    print("配列には多くの要素があります")
}

この例では、配列の要素数に基づいて、さまざまなケースで異なるメッセージを表示しています。これにより、配列の状況に応じた処理を簡潔に実装することができます。

列挙型を使ったマッチング

列挙型(enum)は、定義した複数の状態を表すことができるデータ型です。「switch」文を使って列挙型の値に対して処理を分岐させることができます。列挙型は、状態遷移やアクションを表す際に非常に有用です。

enum Direction {
    case north, south, east, west
}

let heading = Direction.east

switch heading {
case .north:
    print("北に向かっています")
case .south:
    print("南に向かっています")
case .east:
    print("東に向かっています")
case .west:
    print("西に向かっています")
}

このコードでは、列挙型Directionの各ケースに基づいて、現在向いている方角を出力します。列挙型は状態の管理に非常に役立つため、ゲームの開発やUIの状態遷移などで頻繁に使用されます。

複雑なデータ型へのマッチング

Swiftの「switch」文では、より複雑なデータ型に対してもパターンマッチングが可能です。例えば、構造体(struct)やクラス(class)などのカスタムデータ型を使って、それぞれのフィールドに基づいたマッチングを行うこともできます。

struct Person {
    let name: String
    let age: Int
}

let person = Person(name: "John", age: 25)

switch person {
case let p where p.age < 18:
    print("\(p.name) は未成年です")
case let p where p.age >= 18 && p.age < 65:
    print("\(p.name) は成人です")
default:
    print("\(p.name) は高齢者です")
}

この例では、構造体Personのインスタンスpersonに対して、年齢に基づいたパターンマッチングを行っています。このように、複雑なデータ構造にも対応できるため、Swiftの「switch」文は非常に柔軟で強力です。

まとめ

数値以外のデータ型でも、Swiftの「switch」文を用いたパターンマッチングは非常に強力です。文字列、オプショナル、配列、列挙型、さらにはカスタムデータ型に対しても、条件に基づく処理を簡潔に行うことができます。これにより、複雑なアプリケーションロジックをシンプルで読みやすい形で実装できるようになります。

パフォーマンスの考慮

Swiftの「switch」文は、条件分岐を効率的に処理するための強力なツールですが、パフォーマンスを最適化するためにいくつかのポイントに注意する必要があります。特に大規模なデータや頻繁に呼び出されるコード内で「switch」文を使用する際には、適切な設計がパフォーマンスに大きな影響を与えることがあります。

条件の順序と最適化

Swiftの「switch」文では、上から順に各ケースが評価されます。そのため、より一般的に発生するケースや処理コストが低いケースを上位に配置することで、パフォーマンスを改善できます。例えば、頻繁にヒットする条件を最初に配置することで、無駄な評価を減らし、コードの効率を高めることが可能です。

let score = 85

switch score {
case 80...100:
    print("優秀です")
case 60...79:
    print("合格です")
case 0...59:
    print("不合格です")
default:
    print("無効なスコアです")
}

この例では、高得点のケース(80…100)が最初に配置されており、通常はこの範囲に当てはまるスコアが最初に評価されます。もし、大多数のスコアが「不合格」の範囲(0…59)に当てはまるのであれば、その条件を先頭に配置することで、全体の処理速度を向上させることができます。

範囲演算子の使い方

「switch」文において、範囲演算子(.....<)を使うと、複数のケースを一括で処理できるため、個別の条件を記述するよりも効率的です。ただし、範囲が広すぎたり、多くのケースが含まれる場合、すべての条件を逐次評価するため、パフォーマンスに影響を与えることがあります。

最適な範囲設定を行うことが、パフォーマンスを改善する鍵となります。大きな範囲を個別の小さなケースに分けることで、条件評価のオーバーヘッドを減らすことも検討できます。

列挙型の最適化

列挙型(enum)を使った「switch」文は、コンパイル時に最適化されるため、非常に高速に動作します。列挙型を使用する場合、すべてのケースが定義されているため、defaultケースを追加する必要がないこともパフォーマンス向上に寄与します。

enum TrafficLight {
    case red, yellow, green
}

let signal = TrafficLight.red

switch signal {
case .red:
    print("止まってください")
case .yellow:
    print("注意してください")
case .green:
    print("進んでください")
}

列挙型を使うことで、特定のケースが明確であり、余分なケースを評価する必要がないため、パフォーマンスが向上します。また、列挙型は安全性も向上させ、特定の範囲外の値を扱わないことで予期せぬ動作を防ぎます。

guard文や早期リターンを活用した最適化

「switch」文の前に「guard」文を使って無効な条件を早期にリターンすることで、不要な処理を避け、パフォーマンスを最適化することが可能です。特に、オプショナル型や条件が多いケースでは、早期リターンを利用することで、処理のオーバーヘッドを最小限に抑えることができます。

func processScore(score: Int?) {
    guard let score = score, score >= 0 else {
        print("無効なスコアです")
        return
    }

    switch score {
    case 80...100:
        print("優秀です")
    case 60...79:
        print("合格です")
    case 0...59:
        print("不合格です")
    default:
        print("無効なスコアです")
    }
}

このように、最初にguard文で無効なスコアをフィルタリングすることで、switch文で無駄なケースの評価を避けることができます。特に、不要な評価を早期に排除することは、パフォーマンスの大幅な向上に寄与します。

switch文とif文の選択

場合によっては、switch文ではなくif-else文の方が効率的なこともあります。たとえば、比較する条件が少なく、単純な場合にはif-else文の方がシンプルかつ高速です。逆に、多くの分岐や範囲を扱う場合には、switch文がより適切です。状況に応じて、どちらを使うかを選ぶことが、パフォーマンス最適化の重要なポイントです。

まとめ

Swiftの「switch」文は柔軟で強力な条件分岐構文ですが、適切な使い方を意識することで、パフォーマンスも向上させることができます。特に、条件の順序や範囲の設計、列挙型の活用、早期リターンを駆使することで、効率的なコードを書くことが可能になります。

練習問題

ここでは、Swiftの「switch」文とパターンマッチングを実践的に学ぶための練習問題をいくつか用意しました。これらの問題を通じて、整数の範囲や複数の値、さらにはオプショナル型や列挙型に対するマッチングを深く理解できるでしょう。問題を解きながら、コードを書いて動作を確認してみてください。

練習問題1: 整数の範囲マッチング

以下のコードを完成させて、年齢に基づいて適切なメッセージを出力するプログラムを作成してください。

let age = 30

switch age {
case 0...12:
    print("子供です")
case 13...19:
    print("ティーンエイジャーです")
case 20...64:
    // ここに成人の範囲を追加してください
default:
    // ここに高齢者の範囲を追加してください
}

目標: ageが20から64の範囲の場合に「成人です」と出力し、それ以外の場合に「高齢者です」と出力するようにしてください。

練習問題2: 値のリストを使ったマッチング

次のコードを使って、特定の曜日に基づいて「週末です」または「平日です」と出力するプログラムを完成させてください。

let dayOfWeek = "Monday"

switch dayOfWeek {
case "Saturday", "Sunday":
    // 週末の場合のメッセージを追加してください
default:
    // 平日の場合のメッセージを追加してください
}

目標: dayOfWeekが「Saturday」または「Sunday」の場合は「週末です」と出力し、それ以外は「平日です」と出力するようにしてください。

練習問題3: オプショナル型のマッチング

オプショナル型の変数userInputに対して、「switch」文を使って次の処理を行うプログラムを作成してください。userInputがnilの場合は「入力がありません」と出力し、値がある場合は「入力された値は[値]です」と表示するようにしてください。

let userInput: String? = "Hello"

switch userInput {
case .some(let input):
    // 値がある場合のメッセージを追加してください
case .none:
    // 値がない場合のメッセージを追加してください
}

目標: オプショナル型の安全なアンラップ方法を理解し、nilのケースを考慮したコードを書けるようにする。

練習問題4: 列挙型のマッチング

次の列挙型TransportModeを使って、移動手段に応じたメッセージを出力するプログラムを完成させてください。

enum TransportMode {
    case car, bicycle, walking, airplane
}

let mode = TransportMode.bicycle

switch mode {
case .car:
    // 車の場合のメッセージを追加してください
case .bicycle:
    // 自転車の場合のメッセージを追加してください
case .walking:
    // 歩行の場合のメッセージを追加してください
case .airplane:
    // 飛行機の場合のメッセージを追加してください
}

目標: 各移動手段に応じたメッセージ(例えば「車で移動中です」「飛行機に搭乗中です」など)を出力するように実装してください。

練習問題5: where句を使った条件付きマッチング

次のコードを完成させて、整数の値に応じて「偶数です」または「奇数です」と出力するプログラムを作成してください。where句を使って、条件に基づいた処理を行います。

let number = 15

switch number {
case let x where x % 2 == 0:
    // 偶数の場合のメッセージを追加してください
case let x where x % 2 != 0:
    // 奇数の場合のメッセージを追加してください
}

目標: where句を使って条件付きのパターンマッチングを理解し、偶数と奇数に応じたメッセージを表示できるようにする。


これらの練習問題を通じて、Swiftの「switch」文やパターンマッチングに対する理解が深まり、実際の開発シーンでも役立つスキルを身に付けられるでしょう。問題に挑戦し、実際にコードを書いて動作を確認しながら、パターンマッチングの強力さを実感してください。

まとめ

本記事では、Swiftの「switch」文を使った整数範囲や数値パターンのマッチング方法を詳しく解説しました。基本的な構造から、パターンマッチング、範囲演算子、複数の値リスト、ワイルドカード、guard文との組み合わせ、さらに数値以外のデータ型への応用例まで幅広く取り上げました。これにより、「switch」文を効果的に使いこなし、柔軟な条件分岐を実現できるスキルを習得できたでしょう。

コメント

コメントする

目次
  1. switch文の基本構造
    1. breakが不要な理由
  2. パターンマッチングの概要
    1. 複数のパターンに対するマッチング
    2. パターンマッチングの範囲
  3. 範囲演算子を使った整数のマッチング
    1. 閉区間演算子 (`…`)
    2. 半開区間演算子 (`..<`)
    3. 範囲演算子の応用
  4. 値のリストを使ったマッチング
    1. 複数の値を指定する方法
    2. 整数以外のリストでの使用例
    3. メリットと活用シーン
  5. ワイルドカードパターンの使用
    1. ワイルドカードの基本
    2. パターンを無視するワイルドカード
    3. defaultとの違い
  6. guard文との組み合わせ
    1. guard文の基本
    2. guard文とswitch文を組み合わせる
    3. guard文の利点
    4. 使用シーン
  7. パターンマッチングの応用例
    1. タプルを使ったパターンマッチング
    2. オプショナル型のパターンマッチング
    3. where句を使った条件付きパターンマッチング
    4. 列挙型(enum)との組み合わせ
    5. 実践での応用
  8. 数値以外のデータ型でのマッチング
    1. 文字列を使ったマッチング
    2. オプショナル型のマッチング
    3. 配列を使ったマッチング
    4. 列挙型を使ったマッチング
    5. 複雑なデータ型へのマッチング
    6. まとめ
  9. パフォーマンスの考慮
    1. 条件の順序と最適化
    2. 範囲演算子の使い方
    3. 列挙型の最適化
    4. guard文や早期リターンを活用した最適化
    5. switch文とif文の選択
    6. まとめ
  10. 練習問題
    1. 練習問題1: 整数の範囲マッチング
    2. 練習問題2: 値のリストを使ったマッチング
    3. 練習問題3: オプショナル型のマッチング
    4. 練習問題4: 列挙型のマッチング
    5. 練習問題5: where句を使った条件付きマッチング
  11. まとめ