Swiftでswitch文を使った範囲パターンマッチングの詳細解説

Swiftにおいて、条件分岐を行う際に用いる「switch」文は、特にパターンマッチングに優れた機能を提供しています。中でも範囲パターンを使うことで、数値や文字の範囲に基づいて複雑な条件を簡潔に表現できます。例えば、特定の年齢層や得点範囲に応じた異なる処理を行いたい場合、範囲パターンを利用するとコードがより読みやすく、管理しやすくなります。

本記事では、Swiftの「switch」文を使って範囲パターンをどのように活用するかを、具体例を交えながら詳細に解説します。プログラミング初心者から中級者まで、実用的な応用例を通じて、効果的な条件分岐の方法を習得できる内容となっています。

目次
  1. switch文の基本構文
    1. 基本的なswitch文の構造
    2. switch文の特徴
  2. 範囲パターンとは?
    1. 範囲パターンの構文
    2. 範囲パターンのメリット
  3. 数値範囲のマッチング例
    1. 基本的な数値範囲マッチングの例
    2. 複数範囲を同時にチェックする
  4. 文字範囲のマッチング例
    1. 基本的な文字範囲のマッチング
    2. 文字範囲の応用例
    3. 文字範囲の活用シナリオ
  5. switch文での複数条件のマッチング
    1. 複数の値でのマッチング
    2. 複数の範囲パターンを使ったマッチング
    3. 条件の柔軟な組み合わせ
  6. switch文での値の束縛
    1. 値の束縛とは?
    2. 基本的な値の束縛の例
    3. 複雑な条件での値の束縛
    4. 値の束縛の活用シナリオ
  7. 実用的な応用例:年齢区分の判定
    1. 年齢区分を判定するプログラム
    2. さらに高度な例:年齢と特定の条件を組み合わせる
    3. 年齢区分判定の実用シナリオ
  8. switch文のパフォーマンス最適化
    1. パフォーマンスに影響を与える要因
    2. パフォーマンスを向上させる方法
    3. パフォーマンス最適化の利点
  9. よくあるエラーとその対策
    1. 1. 「全てのケースが網羅されていない」エラー
    2. 2. 範囲パターンの重複
    3. 3. 不正な条件付きマッチング
    4. 4. 型の不一致
    5. 5. パフォーマンスの問題
    6. まとめ
  10. 演習問題:範囲パターンを使ったプログラム
    1. 問題1: 年齢による入場料金の判定
    2. 問題2: スコアによる成績判定
    3. 問題3: 温度に基づいた服装の提案
    4. 応用: 複数の条件を組み合わせたマッチング
    5. まとめ
  11. まとめ

switch文の基本構文


Swiftの「switch」文は、指定した値に応じて異なる処理を実行するための条件分岐構文です。他の言語における「switch」文と似ていますが、Swiftでは強力なパターンマッチング機能が組み込まれており、数値や文字列の単純な比較だけでなく、複雑なパターンも扱うことができます。

基本的なswitch文の構造


以下が、基本的な「switch」文の構造です。各ケースは値に基づいて処理を実行し、デフォルトのケースも指定可能です。

let value = 10

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

このように、caseキーワードを使って各条件に対して処理を分岐させます。defaultキーワードは、それまでの条件に当てはまらない場合に実行されるデフォルトの処理を指定します。

switch文の特徴

  • 全てのケースをカバーする必要がある: Swiftの「switch」文は、すべての可能なケースを網羅する必要があります。網羅できない場合はdefaultケースを設ける必要があります。
  • breakは不要: 他の多くの言語と異なり、Swiftでは「switch」文の各ケースでbreak文を記述する必要はありません。ケースが実行された時点で、自動的に処理が終了します。

範囲パターンとは?


Swiftの「switch」文では、範囲パターンを使うことで、数値や文字列の範囲に基づいて処理を分岐させることができます。範囲パターンは、ある値が特定の範囲内にあるかどうかをチェックするために用いられ、コードの可読性を高めるだけでなく、冗長な条件分岐を避けることができます。

範囲パターンの構文


範囲パターンは、caseキーワードの後に...(クローズドレンジ)または..<(ハーフオープンレンジ)を使って指定します。以下は、その基本的な書き方です。

let score = 85

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

この例では、scoreが0から59の範囲内なら「不合格」、60から79なら「合格」、80から100の範囲なら「優秀」と表示されます。範囲に基づく条件分岐を直感的に記述できるため、特定の範囲に基づいて異なる処理を行う際に非常に便利です。

範囲パターンのメリット


範囲パターンを利用することで、以下のような利点があります:

  • コードのシンプル化: 複雑な条件を複数のif文で書くよりも、範囲パターンを使用することで、より簡潔なコードが書けます。
  • 柔軟性: 数値や文字など、さまざまなデータ型に対して範囲パターンを適用できるため、広範囲な場面で活用できます。

範囲パターンは、スコアの評価や年齢区分の判定など、特定の範囲に応じて処理を変えるシナリオで特に有効です。

数値範囲のマッチング例


範囲パターンを使うと、数値に基づいて特定の範囲に応じた処理を簡単に記述できます。数値範囲のマッチングは、スコアの評価や温度の分類など、数値が一定の範囲内にあるかどうかをチェックする際に非常に便利です。

基本的な数値範囲マッチングの例


以下は、数値範囲を使用した「switch」文の例です。ある得点に応じて成績を評価する簡単なプログラムを作成します。

let score = 72

switch score {
case 0..<60:
    print("不合格")
case 60..<70:
    print("C評価")
case 70..<80:
    print("B評価")
case 80..<90:
    print("A評価")
case 90...100:
    print("S評価")
default:
    print("スコアは0から100の範囲内でなければなりません")
}

この例では、scoreが0から59までなら「不合格」、60から69までなら「C評価」、70から79なら「B評価」、80から89なら「A評価」、90から100の範囲なら「S評価」と表示されます。数値範囲を..<(ハーフオープンレンジ)と...(クローズドレンジ)を使い分けて、条件を指定しています。

複数範囲を同時にチェックする


Swiftの「switch」文では、同じケースで複数の範囲パターンをカンマで区切って指定することができます。例えば、複数の範囲を同じ処理に割り当てたい場合、以下のように書くことができます。

let temperature = 25

switch temperature {
case -50..<0:
    print("極寒です")
case 0..<10, 30..<50:
    print("寒いです")
case 10..<30:
    print("快適です")
default:
    print("気温が異常です")
}

この例では、気温が-50度から0度までなら「極寒」、0度から10度または30度から50度までなら「寒い」、10度から30度までなら「快適」と表示されます。範囲を柔軟に設定することで、複雑な条件も簡潔に処理できます。

文字範囲のマッチング例


数値だけでなく、Swiftでは文字も範囲パターンを使ってマッチングすることが可能です。これにより、アルファベットや文字列に基づいた条件分岐を簡単に行うことができます。例えば、名前の頭文字やアルファベット順に応じて異なる処理を実行したい場合、範囲パターンは非常に便利です。

基本的な文字範囲のマッチング


次に、アルファベットの範囲に基づいて特定の文字に対して異なるメッセージを表示する例を示します。

let initial = "B"

switch initial {
case "A"..."C":
    print("頭文字がAからCの名前です")
case "D"..."F":
    print("頭文字がDからFの名前です")
case "G"..."I":
    print("頭文字がGからIの名前です")
default:
    print("別の範囲の頭文字です")
}

このコードでは、initial変数の値が「A」から「C」の範囲にある場合は「頭文字がAからCの名前です」と表示され、同様に「D」から「F」、または「G」から「I」の範囲に基づいて異なるメッセージが表示されます。文字も数値同様に...を使って範囲指定できる点が特徴です。

文字範囲の応用例


範囲パターンは、ユーザー入力の検証や分類など、さまざまな場面で応用できます。次に、入力された文字が母音か子音かを判定する例を示します。

let letter = "E"

switch letter.uppercased() {
case "A", "E", "I", "O", "U":
    print("母音です")
case "B"..."Z":
    print("子音です")
default:
    print("無効な入力です")
}

この例では、母音(A, E, I, O, U)が入力された場合に「母音です」と表示し、それ以外のアルファベットであれば「子音です」と表示します。文字列はuppercased()で大文字に変換しており、大文字と小文字を区別せずに判定できるようにしています。

文字範囲の活用シナリオ

  • アルファベット順での分類: 名前やデータをアルファベット順で分類する際に便利です。
  • 文字列の検証: ユーザーの入力が特定の範囲内にあるかどうかを簡潔に検証できます。

文字範囲のパターンマッチングは、数値と同様にシンプルでありながら、文字列操作の場面で強力なツールとなります。

switch文での複数条件のマッチング


Swiftの「switch」文では、複数の条件を同時にマッチングさせることができ、これによりさらに柔軟な条件分岐が可能になります。複数条件のマッチングは、同じ処理を異なる値や範囲に対して行いたい場合に役立ちます。これにより、if-else文で煩雑になるコードをよりシンプルに保つことが可能です。

複数の値でのマッチング


同じcaseに複数の値をカンマで区切って指定することで、複数の条件をまとめて処理できます。次の例では、数値が特定の範囲内または特定の値にマッチするかどうかを確認します。

let day = "Wednesday"

switch day {
case "Monday", "Tuesday", "Wednesday":
    print("平日です")
case "Saturday", "Sunday":
    print("週末です")
default:
    print("無効な曜日です")
}

この例では、「Monday」、「Tuesday」、「Wednesday」のいずれかの場合に「平日です」と表示され、同様に「Saturday」や「Sunday」の場合に「週末です」と表示されます。カンマで区切ることで、複数の値に同じ処理を簡潔に割り当てることができます。

複数の範囲パターンを使ったマッチング


さらに、範囲パターンと複数の条件を組み合わせることも可能です。以下の例では、数値が複数の異なる範囲に含まれる場合に同じ処理を適用します。

let temperature = 15

switch temperature {
case -50..<0, 30..<50:
    print("極端な気温です")
case 0..<10, 20..<30:
    print("少し寒いです")
case 10..<20:
    print("快適な気温です")
default:
    print("気温が異常です")
}

このコードでは、temperatureが-50度から0度、または30度から50度の場合に「極端な気温です」と表示され、他の範囲に応じて異なるメッセージが表示されます。このように、複数の範囲を一つのcaseで処理することで、複雑な条件をまとめることができます。

条件の柔軟な組み合わせ


「switch」文で複数条件を組み合わせることで、次のような利点があります:

  • コードの簡潔化: 同じ処理を行う条件を一つのcaseにまとめることで、冗長なコードを避けることができます。
  • 読みやすさの向上: 条件が明確になり、コードの可読性が向上します。

複数条件のマッチングは、特に同じ処理を複数のパターンで行いたい場合に非常に有効です。これにより、複雑な条件分岐もシンプルに表現できるようになります。

switch文での値の束縛


Swiftの「switch」文では、範囲パターンを使う際に値を変数に束縛することができます。値の束縛を行うことで、条件に一致した値をそのまま使用し、後続の処理に活かすことが可能です。これにより、switch文内でマッチした値を参照して、さらに柔軟な処理を行えるようになります。

値の束縛とは?


値の束縛とは、特定の条件にマッチした値を新たな変数に割り当て、その変数をcase内で使用することです。これは、特に範囲パターンや複数の条件に一致した値を使った処理を行う場合に便利です。

基本的な値の束縛の例


次に、数値範囲にマッチした値を束縛し、その値を使ってさらに処理を行う例を示します。

let score = 85

switch score {
case 0...59:
    print("不合格です")
case let x where x >= 60 && x < 80:
    print("合格ですが、スコアは \(x) です")
case let x where x >= 80 && x <= 100:
    print("優秀です!スコアは \(x) です")
default:
    print("範囲外のスコアです")
}

この例では、case let xという構文を使って、scoreが特定の範囲内にある場合、その値をxという変数に束縛しています。これにより、範囲内の数値を利用したメッセージを動的に生成することが可能です。たとえば、スコアが85の場合、「優秀です!スコアは 85 です」と表示されます。

複雑な条件での値の束縛


値の束縛は、単純な範囲パターンだけでなく、複雑な条件でも使用できます。次の例では、マッチする値に応じて処理を分岐し、さらにその値を使って追加のロジックを実行します。

let age = 25

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

この例では、年齢が18歳未満、または65歳以上の場合にxという変数に束縛され、年齢を利用してメッセージが動的に生成されます。値の束縛によって、同じswitch文内でより多様な処理を行うことができます。

値の束縛の活用シナリオ


値の束縛は、以下のようなシナリオで特に有効です:

  • 条件に応じたメッセージの動的生成: 範囲内の値に応じてカスタマイズされた出力が必要な場合。
  • 複数条件の組み合わせ: より複雑な条件分岐を処理し、マッチした値をそのまま活用する場合。

値の束縛は、switch文にさらなる柔軟性を持たせ、条件に応じて動的な処理を行いたい場面で非常に便利です。

実用的な応用例:年齢区分の判定


範囲パターンを使用する実際的な応用例として、年齢に基づいて年齢区分を判定するプログラムを紹介します。これにより、特定の年齢層ごとに異なるメッセージや処理を行うことが可能になります。例えば、アプリケーションでユーザーの年齢に応じた異なるサービスを提供する場合などに、この技術を応用できます。

年齢区分を判定するプログラム


次に、年齢を基準にして「幼児」「未成年」「成人」「高齢者」などの区分を判定するプログラムの例を見てみましょう。

let age = 45

switch age {
case 0...5:
    print("幼児です")
case 6...17:
    print("未成年です")
case 18...64:
    print("成人です")
case 65...:
    print("高齢者です")
default:
    print("無効な年齢です")
}

この例では、ageの値に基づいて年齢区分が判定され、対応するメッセージが表示されます。具体的には、年齢が0歳から5歳なら「幼児」、6歳から17歳なら「未成年」、18歳から64歳なら「成人」、65歳以上なら「高齢者」と判定されます。

さらに高度な例:年齢と特定の条件を組み合わせる


年齢区分に加えて、特定の年齢に応じた追加の条件も取り入れた例を考えてみましょう。例えば、成人の中でも特定の年齢層に対して特別な条件を適用する場合です。

let age = 22
let isStudent = true

switch (age, isStudent) {
case (0...5, _):
    print("幼児です")
case (6...17, _):
    print("未成年です")
case (18...64, true):
    print("成人かつ学生です")
case (18...64, false):
    print("成人です")
case (65..., _):
    print("高齢者です")
default:
    print("無効な年齢です")
}

この例では、年齢に加えて「isStudent」という学生であるかどうかを判定する条件を追加しています。年齢が18歳から64歳で、かつisStudenttrueの場合に「成人かつ学生です」と表示され、それ以外は通常の「成人」や「高齢者」として分類されます。このように、範囲パターンと複数の条件を組み合わせることで、より詳細な条件分岐を行うことができます。

年齢区分判定の実用シナリオ


このような年齢区分判定は、さまざまなアプリケーションやサービスにおいて有効です:

  • 保険サービス: 年齢に応じて異なる保険プランを提供する場合。
  • 料金設定: 映画館や交通機関など、年齢によって料金が変わる場合。
  • ユーザーターゲティング: アプリ内でのコンテンツ提供や広告表示を年齢層に応じてカスタマイズする場合。

範囲パターンを使った年齢区分の判定は、複数の条件を簡潔に扱うことができ、実用的なアプリケーションで幅広く応用可能です。

switch文のパフォーマンス最適化


Swiftの「switch」文は、複雑な条件分岐を簡潔に記述できるだけでなく、パフォーマンスの面でも効率的に動作するように設計されています。しかし、適切に使用しないと、パフォーマンスの低下を引き起こす可能性があります。特に、大量のケースや複雑な条件が絡む場合には、最適化を意識することが重要です。

パフォーマンスに影響を与える要因


「switch」文のパフォーマンスは、以下のような要因によって影響を受ける可能性があります。

  1. ケースの数: 「switch」文が扱うケースの数が多いほど、処理時間が長くなる可能性があります。Swiftは内部的に効率化されていますが、ケースの数が非常に多い場合、構造を工夫する必要があります。
  2. 複雑な条件: where節などで複雑な条件を指定すると、パフォーマンスに影響を与える場合があります。条件が多岐にわたる場合は、コードの最適化を検討する価値があります。
  3. 連続した範囲パターン: 複数の範囲パターンを使う場合、重複した範囲や冗長なケースがないか確認することが重要です。

パフォーマンスを向上させる方法


「switch」文のパフォーマンスを最適化するためのいくつかのテクニックを紹介します。

1. ケースを特定の順序で並べる


「switch」文では、最も頻繁に発生するケースを先に記述することで、全体の処理速度を向上させることができます。最初に一致するケースが見つかれば、それ以降のケースはチェックされません。次の例では、よく使われる条件を最初に配置しています。

let statusCode = 200

switch statusCode {
case 200:
    print("成功")
case 400:
    print("リクエストエラー")
case 500:
    print("サーバーエラー")
default:
    print("その他のステータスコード")
}

上記の例では、成功ステータスコード「200」が最初に処理されます。これにより、最もよく発生するケースが最初に評価され、全体の処理時間が短縮されます。

2. 複数の値を一つのケースにまとめる


重複する処理を複数のケースで書く代わりに、同じ処理を行う条件をカンマで区切って一つのケースにまとめると、コードが効率的になります。

let character = "b"

switch character {
case "a", "b", "c":
    print("a、b、cのいずれかです")
default:
    print("その他の文字です")
}

このように、複数の値に対して同じ処理を行う場合は、一つのcaseにまとめることで、無駄な評価を減らすことができます。

3. 範囲パターンの最適化


範囲パターンを使用する際には、重複した範囲や冗長な範囲指定を避けることで、パフォーマンスを向上させることができます。次の例では、範囲パターンを整理して効率化しています。

let score = 75

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

このように範囲を明確かつ効率的に指定することで、冗長なチェックを回避し、パフォーマンスを向上させることができます。

4. switch文の代替:辞書や配列の活用


場合によっては、switch文よりも辞書や配列を使った方が効率的になることがあります。例えば、キーに対して特定の処理を素早くマッピングしたい場合、Dictionaryを使うことでパフォーマンスを向上させられます。

let statusMessages = [
    200: "成功",
    400: "リクエストエラー",
    500: "サーバーエラー"
]

if let message = statusMessages[statusCode] {
    print(message)
} else {
    print("その他のステータスコード")
}

このように、辞書を使って値と処理を直接対応させることで、場合によっては「switch」文よりも高速な処理が可能になります。

パフォーマンス最適化の利点


「switch」文の最適化は、特に条件が多くなったり、複雑なロジックが必要になるアプリケーションで有効です。最適化を行うことで、以下のようなメリットがあります:

  • コードの実行速度向上: 無駄な評価を減らすことで、コードの実行が速くなります。
  • 可読性の向上: 重複や冗長な条件を排除することで、コードが整理され、可読性が高まります。
  • 保守性の向上: 複数条件を一つにまとめることで、変更や追加がしやすくなり、コードの保守が容易になります。

「switch」文を適切に最適化することで、アプリケーションのパフォーマンスを向上させることができ、特に大規模なプロジェクトではその効果が大きく現れます。

よくあるエラーとその対策


Swiftの「switch」文を使用する際、特に範囲パターンや複雑な条件を使った場合に、いくつかのよくあるエラーに直面することがあります。これらのエラーを理解し、適切に対処することで、バグの発生を防ぎ、効率的にコードを記述できます。ここでは、代表的なエラーとその解決策を紹介します。

1. 「全てのケースが網羅されていない」エラー


Swiftの「switch」文は、すべての可能なケースを網羅する必要があります。例えば、整数型の値に対して「switch」文を使う場合、すべての値がカバーされていないとコンパイルエラーが発生します。次のコードは、このエラーを引き起こす例です。

let number = 3

switch number {
case 1:
    print("1です")
case 2:
    print("2です")
// 3に対応するcaseがない
}

対策:
すべてのケースを網羅するためにdefaultケースを追加するか、想定するすべての値に対してcaseを定義します。

let number = 3

switch number {
case 1:
    print("1です")
case 2:
    print("2です")
default:
    print("それ以外の値です")
}

defaultを追加することで、未対応の値に対してもエラーが発生せず、適切な処理を行うことができます。

2. 範囲パターンの重複


範囲パターンを使用する際、同じ範囲が複数のcaseでカバーされている場合、重複したケースにマッチする可能性があります。このような場合、Swiftは先に定義されたcaseが優先されますが、後のケースが実行されないため、バグの原因になります。

let score = 75

switch score {
case 0...80:
    print("合格")
case 70...100:  // 70...80は既に前のcaseでカバーされている
    print("優秀")
}

対策:
範囲パターンは明確に区分されるようにし、重複を避けます。以下のように範囲を整理すると、重複を防げます。

let score = 75

switch score {
case 0..<70:
    print("合格")
case 70...100:
    print("優秀")
}

これにより、各caseがユニークな範囲に対応し、重複が解消されます。

3. 不正な条件付きマッチング


where句を使って追加の条件を指定する際、複雑な条件が適切に評価されない場合があります。例えば、条件が冗長だったり、無効な論理構造が使われていると、期待通りに動作しない可能性があります。

let age = 25

switch age {
case let x where x < 18 && x > 65:
    print("無効な年齢範囲です")
default:
    print("有効な年齢です")
}

この例では、xが同時に18歳未満で65歳以上という条件を満たすことは不可能なので、処理が実行されません。

対策:
where句の条件が正しいか、論理構造に矛盾がないかを確認し、条件を適切に修正します。

let age = 25

switch age {
case let x where x < 18 || x > 65:
    print("特定の年齢区分です")
default:
    print("通常の年齢です")
}

これにより、条件が正しく評価され、期待通りの結果が得られるようになります。

4. 型の不一致


switch文では、比較対象の型が一致している必要があります。たとえば、整数型の変数に対して文字列型のケースを指定すると、コンパイルエラーが発生します。

let number = 10

switch number {
case "10":  // 型が不一致
    print("文字列の10です")
default:
    print("整数の値です")
}

対策:
switch文で比較する値とcaseに指定する値の型を一致させます。

let number = 10

switch number {
case 10:
    print("整数の10です")
default:
    print("その他の値です")
}

これにより、型の不一致エラーが解消されます。

5. パフォーマンスの問題


複雑な条件や大量のcaseを持つ「switch」文では、パフォーマンスに影響が出る可能性があります。これが特に顕著になるのは、処理が多岐にわたる場合や大規模なデータセットを扱うときです。

対策:
前述のパフォーマンス最適化のテクニックを適用し、コードの効率を上げることが重要です。特に、冗長な条件を整理したり、最も頻繁に使用されるケースを先に評価することが効果的です。

まとめ


「switch」文は強力な条件分岐ツールですが、範囲パターンや複雑な条件を使う際には、よくあるエラーに注意する必要があります。全てのケースを網羅し、重複や矛盾のない条件を設定することで、エラーを防ぎ、効率的にコードを記述することができます。

演習問題:範囲パターンを使ったプログラム


ここでは、範囲パターンを使った「switch」文の理解を深めるための演習問題を紹介します。これらの問題に取り組むことで、範囲パターンや値の束縛、複数条件のマッチングといった重要なポイントを実践的に学ぶことができます。

問題1: 年齢による入場料金の判定


以下の条件に基づいて、映画館の入場料金を判定するプログラムを作成してください。

  • 0歳〜5歳: 無料
  • 6歳〜17歳: 子供料金(500円)
  • 18歳〜64歳: 大人料金(1000円)
  • 65歳以上: シニア料金(700円)
let age = 22

switch age {
case 0...5:
    print("入場料金は無料です")
case 6...17:
    print("入場料金は500円です")
case 18...64:
    print("入場料金は1000円です")
case 65...:
    print("入場料金は700円です")
default:
    print("無効な年齢です")
}

このプログラムを参考にして、自分で異なる年齢の判定や料金設定を行ってみてください。

問題2: スコアによる成績判定


次に、テストのスコアに基づいて成績を判定するプログラムを作成してください。以下の条件を使用して、スコアを判定します。

  • 0〜59点: 不合格
  • 60〜69点: D評価
  • 70〜79点: C評価
  • 80〜89点: B評価
  • 90〜100点: A評価
let score = 85

switch score {
case 0..<60:
    print("不合格")
case 60..<70:
    print("D評価")
case 70..<80:
    print("C評価")
case 80..<90:
    print("B評価")
case 90...100:
    print("A評価")
default:
    print("無効なスコアです")
}

この演習を拡張して、評価に応じたメッセージをさらにカスタマイズすることも可能です。

問題3: 温度に基づいた服装の提案


最後に、温度に基づいて適切な服装を提案するプログラムを作成してください。

  • 0度未満: 厚手のコートを着る
  • 0度〜10度: ジャケットを着る
  • 11度〜20度: セーターを着る
  • 21度〜30度: 半袖のシャツを着る
  • 31度以上: 涼しい服装をする
let temperature = 15

switch temperature {
case ..<0:
    print("厚手のコートを着る")
case 0...10:
    print("ジャケットを着る")
case 11...20:
    print("セーターを着る")
case 21...30:
    print("半袖のシャツを着る")
case 31...:
    print("涼しい服装をする")
default:
    print("無効な温度です")
}

このプログラムでは、温度の範囲に応じて適切な服装を提案します。気温の範囲を変更して、より詳細なアドバイスを提供するプログラムに拡張することもできます。

応用: 複数の条件を組み合わせたマッチング


さらに、年齢と他の条件(例えば、学生かどうか)を組み合わせた条件分岐を作成してみてください。次の例を参考に、自分で条件を追加して複雑な条件分岐を試してみてください。

let age = 20
let isStudent = true

switch (age, isStudent) {
case (0...5, _):
    print("幼児で入場無料です")
case (6...17, _):
    print("未成年で子供料金です")
case (18...64, true):
    print("成人かつ学生で割引料金です")
case (18...64, false):
    print("成人で通常料金です")
case (65..., _):
    print("シニア料金です")
default:
    print("無効な年齢です")
}

この応用問題では、年齢と他の属性を組み合わせたパターンマッチングを学べます。

まとめ


これらの演習問題を通じて、範囲パターンや複数条件のマッチング、値の束縛を用いた「switch」文の実践的な使用方法を学びました。これらのスキルは、条件分岐が多く登場するプログラムを効率的に記述する際に非常に有効です。

まとめ


本記事では、Swiftの「switch」文を使った範囲パターンマッチングの方法を詳しく解説しました。基本的な構文から始まり、数値や文字の範囲マッチング、複数条件の組み合わせ、そして値の束縛といった高度な機能まで学びました。さらに、年齢区分の判定や温度に応じた処理など、実用的な応用例や演習問題を通して、実践的なスキルを磨くことができました。これにより、より効率的で柔軟な条件分岐が可能になり、Swiftでの開発がさらに快適になるでしょう。

コメント

コメントする

目次
  1. switch文の基本構文
    1. 基本的なswitch文の構造
    2. switch文の特徴
  2. 範囲パターンとは?
    1. 範囲パターンの構文
    2. 範囲パターンのメリット
  3. 数値範囲のマッチング例
    1. 基本的な数値範囲マッチングの例
    2. 複数範囲を同時にチェックする
  4. 文字範囲のマッチング例
    1. 基本的な文字範囲のマッチング
    2. 文字範囲の応用例
    3. 文字範囲の活用シナリオ
  5. switch文での複数条件のマッチング
    1. 複数の値でのマッチング
    2. 複数の範囲パターンを使ったマッチング
    3. 条件の柔軟な組み合わせ
  6. switch文での値の束縛
    1. 値の束縛とは?
    2. 基本的な値の束縛の例
    3. 複雑な条件での値の束縛
    4. 値の束縛の活用シナリオ
  7. 実用的な応用例:年齢区分の判定
    1. 年齢区分を判定するプログラム
    2. さらに高度な例:年齢と特定の条件を組み合わせる
    3. 年齢区分判定の実用シナリオ
  8. switch文のパフォーマンス最適化
    1. パフォーマンスに影響を与える要因
    2. パフォーマンスを向上させる方法
    3. パフォーマンス最適化の利点
  9. よくあるエラーとその対策
    1. 1. 「全てのケースが網羅されていない」エラー
    2. 2. 範囲パターンの重複
    3. 3. 不正な条件付きマッチング
    4. 4. 型の不一致
    5. 5. パフォーマンスの問題
    6. まとめ
  10. 演習問題:範囲パターンを使ったプログラム
    1. 問題1: 年齢による入場料金の判定
    2. 問題2: スコアによる成績判定
    3. 問題3: 温度に基づいた服装の提案
    4. 応用: 複数の条件を組み合わせたマッチング
    5. まとめ
  11. まとめ