- はじめに
- ●Swiftのswitch文とは
- ●Swiftのswitch文の使い方
- ●Swiftのswitch文の応用例
- ○サンプルコード5:enumを使った例
- ○サンプルコード6:関連値を持つenumとの組み合わせ
- ○サンプルコード7:switch文を使った計算処理
- ○サンプルコード8:switch文とfor-inループの組み合わせ
- ○サンプルコード9:関数の戻り値としてのswitch文
- ○サンプルコード10:switch文を使ったエラーハンドリング
- ○サンプルコード11:オプショナルバインディングとの組み合わせ
- ○サンプルコード12:switch文を活用したデザインパターン
- ○サンプルコード13:switch文でのパターンマッチングの活用
- ○サンプルコード14:多重のswitch文のネスティング
- ○サンプルコード15:caseの値を変数や定数として取り出す
- ○サンプルコード16:複数のcaseに一つの処理をまとめて記述
- ○サンプルコード17:fallthroughを使った処理の継続
- ●注意点と対処法
- ●カスタマイズ方法
- まとめ
はじめに
SwiftはAppleによって開発されたプログラミング言語であり、iOS、macOS、watchOS、tvOSといったAppleのプラットフォーム向けのアプリケーション開発に主に使用されています。
Swiftの特徴の一つに、安全性の高い設計や直感的な文法が挙げられます。
そして、その中でもswitch文
は、多岐にわたる条件分岐を綺麗に、そして効率的に扱うことができる強力な文法として知られています。
今回の記事では、Swift言語でのswitch文の詳細な使い方、注意点、カスタマイズ方法を徹底的に解説します。
Swiftのswitch文に関する知識をゼロから学びたい初心者の方はもちろん、既に基本的な知識を持っている方でも、さらなる深みを求めている方にも役立つ内容となっています。
17のサンプルコード付きで、一つ一つの機能や使い方を具体的に理解していきましょう。
●Swiftのswitch文とは
switch文
とは、ある変数や値が与えられた時に、その値に応じて異なる処理を行いたい場合に使用する制御文の一つです。
特に、3つ以上の選択肢がある場合や、複雑な条件を持つ場合にif文
よりも簡潔に、そして読みやすく書くことができます。
Swiftのswitch文は他の多くのプログラミング言語のそれとは異なり、非常に柔軟性が高いのが特徴です。
例えば、複数の値を一度にマッチさせたり、値の範囲やパターンを指定してマッチさせることができます。
また、タプルやenumといったデータ型と組み合わせて使用することで、さらに高度な条件分岐を行うことができるようになります。
○switch文の基本
switch文の基本的な構文は次のようになります。
この構文を見るとわかるように、Swiftのswitch文はそれぞれのcaseで指定した値に対象の変数や値がマッチするかどうかをチェックしています。
そして、マッチしたcaseの処理が実行されます。もし、どのcaseにもマッチしない場合は、default
の処理が実行されます。
Swiftのswitch文は、一つのcaseが真となった時点で、それ以降のcaseは評価されず、switch文自体が終了します。
これにより、複数のcaseが真となるようなことはありません。
また、Swiftのswitch文の大きな特徴として、各caseでのbreak文の記述が不要である点が挙げられます。
他の多くの言語では、一つのcaseが真となった後、次のcaseへの処理が流れてしまわないようにbreak文を記述する必要がありますが、Swiftではその必要がありません。
一つのcaseが真となった時点で、自動的にswitch文の処理が終了するからです。
●Swiftのswitch文の使い方
Swiftのswitch文は、多岐にわたる条件を分岐させるときに非常に有効な文法です。
多くのプログラミング言語に似たswitch文が存在しますが、Swiftのswitch文は他の言語とは少し異なる特性や利点があります。
ここでは、Swiftのswitch文の基本的な使い方を、詳細な説明とサンプルコードを交えてご紹介します。
○サンプルコード1:基本的なswitch文の書き方
Swiftのswitch文の基本的な書き方を見ていきましょう。
このコードでは、animal
という文字列変数を使ってswitch文を表しています。
この例では、animal
の内容に応じて、適切なメッセージを出力しています。
case文で指定した文字列とanimal
の値が一致した場合、そのcase内の処理が実行されます。
もし、どのcaseにも当てはまらない場合は、default
節の処理が実行されます。
このコードを実行すると、「これは犬です」と表示されます。
○サンプルコード2:値の範囲を指定してマッチさせる
Swiftのswitch文は、値の範囲を指定してマッチさせることも可能です。
これにより、特定の範囲の値に対して処理を行うことができます。
このコードでは、score
という整数変数に対して、範囲を指定したswitch文を使用しています。
この例では、score
の値が0から59の範囲であれば「不合格」、60から79の範囲であれば「合格」、80から100の範囲であれば「優秀」と表示します。
また、どの範囲にも当てはまらない場合は、「スコアが不正です」と表示されます。
このコードを実行すると、「優秀」と表示されます。
○サンプルコード3:タプルを利用したswitch文
Swiftでは、switch文を使用してタプルの値に基づいて条件分岐を行うことができます。
タプルを用いると、複数の変数や値をまとめて扱い、それらの組み合わせに基づいて分岐を行うことが可能となります。
下記のサンプルコードでは、二次元平面上の点の位置を表すタプル(x, y)を使って、その点がどの象限に位置するかを判定するコードを表しています。
この例では、x軸とy軸の正負を考慮して、1から4までの象限を判定しています。
上のコードでは、switch
文を用いてタプルのpoint
の値に応じてメッセージを出力しています。
case
の部分でタプルの各要素を変数x
、y
に束縛しており、where
句を使用して条件を追加しています。
このコードを実行すると、point
の値に応じて次のように出力されます。
pointが(2, -3)の場合、出力は「第4象限に位置します。」となります。
○サンプルコード4:where句を使った条件の追加
Swiftのswitch文では、where
句を使用して、条件を追加することができます。
これにより、より複雑な条件分岐を実現することが可能となります。
下記のサンプルコードでは、整数の配列から偶数のみを抽出して、その偶数が10以上であるかどうかを判定するコードを表しています。
この例では、where
句を使用して、条件を追加しています。
このコードでは、for-in
ループを用いて配列の要素を1つずつ取り出し、その値が偶数かつ10以上であるか、偶数であるか、その他の場合かを判定しています。
このコードを実行すると、各数字に応じて次のように出力されます。
12は10以上の偶数であるため、「12は10以上の偶数です。」、8は偶数であるため、「8は偶数です。」、その他の数字については、「数字は奇数、または10未満の数です。」といった形で出力されます。
●Swiftのswitch文の応用例
Swiftのswitch文は非常に強力で柔軟性が高く、多くのシナリオで使用することができます。
その基本的な使い方や書き方から一歩進んだ応用例について解説します。
初心者から上級者まで、Swiftを使ったプログラミングのスキルアップに役立つ内容となっています。
具体的なサンプルコードも交えながら、各機能のポイントや活用方法を詳しく見ていきましょう。
○サンプルコード5:enumを使った例
Swiftのenum(列挙型)は、限定された選択肢を持つデータ型を定義するのに便利です。
このenumとswitch文を組み合わせることで、各ケースに応じた処理を綺麗に書くことができます。
下記のコードでは、季節を表すenumと、それを受け取り適切なメッセージを返す関数を表しています。
このコードでは、Season
というenumを使って春、夏、秋、冬の4つの季節を表しています。
describeSeason
関数は、引数としてSeason
型を受け取り、それに応じた季節の説明を返します。
この例ではcurrentSeason
として春を指定しており、結果として”春は花が咲く季節です。”というメッセージが出力されます。
○サンプルコード6:関連値を持つenumとの組み合わせ
Swiftのenumは関連値を持つことができます。
これにより、enumの各ケースに関連する情報を持たせることが可能です。
関連値を持つenumとswitch文を組み合わせることで、より複雑なロジックを簡潔に表現することができます。
下記のコードは、交通機関とその速度を表すenumを表しています。
このコードでは、Transportation
というenumで車、電車、飛行機の3つの交通機関とそれぞれの速度(単位:km/h)を表現しています。
travelTime
関数は、指定された距離と交通機関に応じて、移動にかかる時間を計算します。
この例では車での移動を指定しており、速度が100km/hで500km移動するのにかかる時間を計算し、結果として”移動時間は5時間です。”というメッセージが出力されます。
○サンプルコード7:switch文を使った計算処理
このコードでは、数値を取得し、それに応じた計算処理をswitch文を使って実行する方法を表しています。
この例では、数値が偶数か奇数かを判定し、その結果を文字列として返す処理を行っています。
上のサンプルコードでは、関数judgeEvenOrOdd
を定義しています。
引数として数値number
を受け取り、この数値が偶数か奇数かを判定して、結果を文字列として返します。
number % 2
という式は、数値を2で割った余りを計算します。
その結果が0ならば偶数、1ならば奇数として、それぞれのcaseブロック内の処理が実行されます。
ここで、default節を使用する理由は、理論的には余りが0か1のどちらかになるため不要ですが、安全性を確保するために追加しています。
このコードを実行すると、judgeEvenOrOdd(number: 5)
は5
という数値を引数に取り、その結果として”奇数です”という文字列を返します。
したがって、変数result
には”奇数です”という文字列が格納されます。
○サンプルコード8:switch文とfor-inループの組み合わせ
このコードでは、for-inループを使用して、複数の数値を一つずつ取得し、その都度switch文で計算処理を行う方法を表しています。
この例では、1から5までの数値が偶数か奇数かを判定し、その結果を出力する処理を行っています。
このコードを実行すると、1から5までの数値を一つずつ取り出して、それが偶数か奇数かを判定します。
そして、その結果を”数字は偶数です”や”数字は奇数です”という形式で出力します。
具体的な実行結果としては、次のように表示されます。
○サンプルコード9:関数の戻り値としてのswitch文
Swiftでは、関数の戻り値としてswitch
文を使用することができます。
これにより、関数の返り値を動的に変更することができ、より柔軟なコードの実装が可能となります。
具体的な使用方法をサンプルコードで確認しましょう。
このコードでは、judgeGrade
という関数を定義しています。
関数の引数として受け取ったscore
の値に応じて、評価をString型で返しています。
この例では、85というスコアを関数に渡しているので、”良”という文字列が出力されます。
こうした方法で、関数の戻り値としてswitch
文を使用することで、異なる条件に基づいて異なる結果を返すことが可能になります。
さらに、この概念を応用して、エラーハンドリングにも使用することができます。
○サンプルコード10:switch文を使ったエラーハンドリング
Swiftにおいて、エラーのハンドリングは非常に重要です。
switch
文を活用することで、エラーの種類に応じた適切な処理を行うことができます。
ここでは、switch
文を使ったエラーハンドリングのサンプルコードを紹介します。
このコードでは、NetworkError
というエラーの列挙型を定義しています。
そして、fetchResource
という関数内でエラーを投げる処理を行っています。
do-catch
文を使用してエラーをハンドリングしており、catch
節内でエラーの種類に応じてswitch
文で適切なメッセージを表示しています。
このように、switch
文を利用してエラーハンドリングを行うことで、エラーの種類ごとに適切な処理やメッセージを出力することが容易になります。
○サンプルコード11:オプショナルバインディングとの組み合わせ
Swiftでは、変数や定数に値が存在するかどうかをオプショナル型で扱います。
switch文とオプショナルバインディングを組み合わせることで、オプショナルの値の有無や内容に応じた処理を簡潔に書くことができます。
下記のコードでは、オプショナル型の整数number
をswitch文とオプショナルバインディングを使って処理しています。
このコードでは、number
がnil
でない場合にはその値を取り出し、nil
の場合には”値がありません”と表示しています。
上記のコードでは、value?
を使用することでオプショナルの値が存在する場合にその値をvalue
という定数にバインドしています。
この方法を利用することで、条件の中で直接オプショナルの中身を利用することができます。
このコードを実行すると、”数値は5です。”と表示されます。もしnumber
がnil
であれば、”値がありません。”と表示されるでしょう。
○サンプルコード12:switch文を活用したデザインパターン
switch文は、単に値のマッチングだけでなく、設計パターンの実装にも役立ちます。
下記の例は、状態に応じた処理を表すデザインパターンをswitch文を使って実装したものです。
まず、アプリの状態を表すenum型AppState
を定義します。
次に、現在のアプリの状態を表す変数currentState
を定義し、switch文を使って状態に応じた処理を行います。
このコードでは、currentState
が.error("ネットワークエラー")
であるため、”エラー: ネットワークエラー”と表示されます。
AppState
に定義された他の状態であれば、それに応じたメッセージが表示されるでしょう。
このように、switch文を使うことで、状態の変化に応じた処理を明確に記述することができます。
特にenum型と組み合わせることで、コードの可読性やメンテナンス性が向上します。
○サンプルコード13:switch文でのパターンマッチングの活用
Swiftのswitch文は、単純な値の比較だけでなく、パターンマッチングという強力な機能も持っています。
パターンマッチングを活用することで、より複雑な条件を簡潔に記述することができます。
このコードでは、Vehicleというenumを定義しています。
そして、myVehicleという変数に、Vehicle型のcarという値を持つインスタンスを代入しています。
switch文内のcaseでは、enumの値ごとにマッチさせ、さらにwhere句を使って詳細な条件を指定しています。
実際の出力結果は、「これはトヨタの車です」というメッセージが表示されることになります。
○サンプルコード14:多重のswitch文のネスティング
Swiftのswitch文はネスティングも可能です。
これにより、複数の条件を組み合わせた複雑な分岐を実現することができます。
ここでは、ネスティングを使用したswitch文の一例を紹介します。
このコードでは、二次元平面上の点の座標を示すタプルcoordinateを用いています。
まず、基本的な位置を示すswitch文を記述しています。
その中で、X軸とY軸の値の大小を判断するためのネスティングされたswitch文を記述しています。
実際の出力結果としては、「X軸の値の方が大きいです」と表示されることになります。
○サンプルコード15:caseの値を変数や定数として取り出す
Swiftのswitch文では、マッチしたcaseの値を変数や定数として取り出すことができます。
これにより、その値を後続の処理で活用することが可能になります。
このコードでは、タプルitem
の中身をswitch文を用いて取り出しています。
具体的には、(name, price)
というパターンでマッチさせ、変数name
とprice
にタプルの要素を束縛しています。
この例では、”apple”と150がそれぞれname
とprice
に束縛され、print関数で表示されます。
実行すると、次のような結果が得られます。
注意点として、この方法で変数や定数に束縛する場合、case内でのみその値を参照できることを理解しておくと良いでしょう。
○サンプルコード16:複数のcaseに一つの処理をまとめて記述
Swiftのswitch文では、複数のcaseに一つの処理をまとめて記述することができます。
これにより、同じ処理を複数の条件で行いたい場合にコードの重複を避けることができます。
このコードでは、number
という変数の値に応じて、奇数か偶数かを判断しています。
複数のcaseをカンマで区切ることで、一つのcaseブロック内で共通の処理を記述することができます。
この例では、1, 3, 5, 7, 9のいずれかの場合には”奇数”と表示し、2, 4, 6, 8, 10のいずれかの場合には”偶数”と表示します。
実行すると、次のような結果が得られます。
○サンプルコード17:fallthroughを使った処理の継続
Swiftのswitch文で、あるcaseの処理が終了した後に次のcaseの処理を続けて実行したい場合、fallthrough
キーワードを使用することができます。
このコードでは、character
という変数の値が”a”の場合、最初のcaseの処理が実行されます。
その後、fallthrough
によって次のcaseの処理も実行されるようになっています。
この例では、”文字はaです。”と表示された後に”また、文字はbです。”という出力も行われます。
実行すると、次のような結果が得られます。
●注意点と対処法
Swiftでのswitch
文を使用する際には、いくつかの注意点が存在します。
ここでは、その注意点と、それに関連する対処法を詳しく解説していきます。
○breakを忘れずに
Swiftのswitch
文は、他の多くのプログラミング言語とは異なり、case
がマッチした際に自動で処理が終了します。
つまり、break
文を明示的に書く必要はありません。
しかし、他の言語の経験者であれば、break
文を書く習慣が身についているかもしれません。
Swiftではbreak
文を使うことで、そのcase
の処理を明示的に終了させることができます。
ただし、不要な場面でのbreak
文の使用は冗長となるため、適切に使用することが重要です。
このコードでは、switch
文を使用して整数の値を判定しています。
この例では、各case
にbreak
を使用せず、マッチしたcase
の処理が自動で終了しています。
上記のコードを実行すると、「Three」と表示されます。
○default節の重要性
switch
文を使用する際、考慮していない値が入力された場合の処理を記述するために、default
節を使用します。
Swiftでは、すべての可能性を網羅することが求められるため、default
節の使用は非常に重要です。
もし、default
節を省略してすべての値を網羅していないswitch
文を書いた場合、コンパイルエラーとなります。
このコードでは、1から3の整数を判定するswitch
文を表しています。
この例では、1〜3以外の値が入力された場合の処理として、default
節を用いています。
上記のコードを実行すると、「Number is out of range」と表示されます。
○条件の重複を避ける
switch
文を記述する際、複数のcase
節で同じ条件を書くと、コンパイルエラーが発生します。
したがって、それぞれのcase
節での条件は、重複しないように気をつける必要があります。
このコードでは、整数の値を判定するswitch
文を表しており、条件の重複によるコンパイルエラーの例を表しています。
上記のコードはコンパイルエラーとなるため、正しく実行することはできません。
このような場合、重複する条件を削除するか、条件を変更してエラーを回避します。
●カスタマイズ方法
Swiftのswitch文は、他のプログラム言語と比較しても高機能であり、そのカスタマイズの方法も多岐にわたります。
特に、Swiftは読みやすさや安全性を重視した言語であるため、switch文もそれに応じたカスタマイズが可能です。
ここでは、switch文のスタイルや整形、独自のマッチングロジックの追加方法について詳しく説明します。
○switch文のスタイルや整形
Swiftのswitch文を読みやすくするために、スタイルや整形の方法をカスタマイズすることができます。
例えば、一般的にはswitch文は次のように書かれることが多いです。
このコードでは、変数が値1の時に処理1を、値2の時に処理2を、それ以外の場合にはその他の処理を行います。
ただ、場合によっては、caseと処理を一行で記述することで、コードの見た目をすっきりとさせることもできます。
この例では、caseとその後の処理が一行で書かれているため、コードが簡潔になります。
どちらのスタイルが良いかは、チームやプロジェクトのルールによるため、一概には言えませんが、どちらのスタイルも正式にサポートされているため、自分の好みやチームのルールに合わせてカスタマイズすることができます。
○独自のマッチングロジックの追加
Swiftのswitch文では、標準的なマッチングロジック以外にも、独自のロジックを追加することが可能です。
これは、where句を使用することで実現できます。
例えば、次のようなコードを考えてみましょう。
このコードでは、タプルのxとyが等しい場合、XはYより大きい場合など、独自のマッチングロジックを追加しています。
このように、where句を使用することで、標準的なマッチングロジック以外の条件を追加することができます。
これにより、switch文の柔軟性が向上し、さまざまな条件を簡潔に表現することができるようになります。
この例の実行結果としては、”それ以外の場合”という結果が得られます。
なぜなら、pointのxとyは等しくなく、xがyよりも大きくもないため、defaultの処理が実行されるからです。
まとめ
Swiftのswitch文は非常に柔軟で、多岐にわたる条件分岐を簡潔に表現することができます。
基本的な使い方から、独自のマッチングロジックの追加まで、さまざまなカスタマイズ方法を活用することで、コードの可読性や効率性を向上させることができます。
特にwhere句を用いることで、より詳細な条件を追加し、複雑な条件分岐も簡潔に表現することが可能です。
Swiftを使用する際は、switch文の豊富な機能を最大限に活用して、効率的なプログラミングを心がけましょう。