フローの制御について
学習の目的
この単元を完了すると、次のことができるようになります。
if
ステートメントとelse
ステートメントを使用して、どのコードが実行されるのかを制御する。- 論理演算子を使用して、何かが true なのか false なのかをチェックする。
- switch ステートメントを使用して、どのコードが実行されるのかを制御する。
- 3 項演算子を使用して、条件に応じて異なる値を定数または変数に代入する。
「Swift の使用開始」単元で、Swift プログラムは、上から下に実行される .swift
ファイルで記述されることを学びました。このことは、playgound ファイルでの作業でも確認しました。ただし、大きなアプリケーションはそう単純ではありません。1 つのファイルには収まらないし、通常は上から下までコード行がすべて実行されるわけではありません。
先に実行されたコードの結果に応じて、実行するコード行が決定されるコードを記述します。これをフローの制御と呼びます。
このレッスンでは、論理演算子を使用して条件をチェックする方法と、フロー制御のステートメント (if
、if-else
、switch
) を使用して結果に応じて実行されるコードを選択する方法を学びます。
ログインが必要なアプリケーションを考えてください。アプリケーションを起動したときに、すでにログイン済みであれば、自分のデータが表示されます。ログインしていない場合は、ログイン情報を求められます。正しいユーザー名とパスワードを入力してログインしたら自分のデータが表示されます。入力したログイン情報が正しくなければ、正しい情報の入力を求められます。
例では、複数のチェックが必要で、その結果に基づいてコードが実行される、一般的な相互作用について説明します。
これらのチェックは条件ステートメントと呼ばれ、フロー制御という上位概念の中に含まれます。開発者は、特定の条件についてチェックし、それらの条件に基づいて異なるコードブロックを実行する、フロー制御のツールを使用できます。
一連の条件の結果に基づき、さまざまなステートメントを使用して、どのコードが実行されるのかを制御できます。これらの条件ステートメントはすべてフロー制御の例です。
論理演算子
各 if
ステートメントでは、論理演算子を使用して、何かが true
なのか false
なのかが決定されます。その結果、コードブロックを実行するのかスキップするのかが判断されます。
まずは、次の一般的な演算子のリストを見ていきましょう。
演算子 |
説明 |
== |
2 つの項目が一致しなければならない |
!= |
両方の値が一致してはならない |
> |
左側の値が右側の値より大きくなければならない |
>= |
左側の値が右側の値以上でなければならない |
< |
左側の値が右側の値より小さくなければならない |
<= |
左側の値が右側の値以下でなければならない |
&& |
AND — 左側と右側が true でなければならない条件ステートメント |
|| |
OR — 左側または右側が true でなければならない条件ステートメント |
! |
NOT — 演算子のすぐ後に続く条件ステートメントの逆を返す |
異なる論理演算子を組み合わせて Boolean 値 (Bool
) を作成できます。Boolean 値は true
か false
のどちらかになり、if
ステートメントと組み合わせて、コードを実行するのかスキップするのかが判断されます。
if ステートメント
最もわかりやすい条件ステートメントは、if
ステートメントです。簡単に言えば、if
ステートメントは「この条件が true であれば、このコードブロックを実行する」ということを表します。条件が true でない場合、そのコードブロックはスキップされます。
ほとんどの場合、if
ステートメントは、起こりうる結果が数個しかない単純な条件をチェックするために使用します。次に例を示します。
let temperature = 100 if temperature >= 100 { print("The water is boiling.") }
これは、次のように出力されます。
The water is boiling.
temperature
定数は 100
と等しくなっています。if
ステートメントは temperature
が 100
以上であれば、テキストを出力します。if
ステートメントが true
に解決されるので、if
ステートメントに付随するコードブロックが実行されます。
if-else ステートメント
if ステートメントの条件が true であれば、コードブロックが実行されることを学びました。では、条件が true でない場合はどうなるのでしょうか? if ステートメントに else を追加することで、条件が true でない場合に実行されるコードブロックを指定できます。
let temperature = 100 if temperature >= 100 { print("The water is boiling.") } else { print("The water is not boiling.") }
この考えをさらに発展させることができます。else if
を使用することで、任意の数の条件に基づいて実行される追加のコードブロックを宣言できます。次のコードは、レースに参加したアスリートの順位をチェックし、適切に応答します。
var finishPosition = 2 if finishPosition == 1 { print("Congratulations, you won the gold medal!") } else if finishPosition == 2 { print("You came in second place, you won a silver medal!") } else { print("You did not win a gold or silver medal.") }
任意の数の潜在的ケースに対応する else if
ステートメントを多数使用できます。
Boolean 値
値を後でチェックまたはアクセスするために、論理演算子の結果を Bool
定数または変数に代入できます。Bool
値は、true
か false
にしかなりません。
次のコードの Bool
ステートメントで、number
は isSmallNumber
としてみなされないと判断されます。
let number = 1000 let isSmallNumber = number < 10 // number is not less than 10, so isSmallNumber is assigned a `false` value
次の Bool
ステートメントで、currentSpeed
は isSpeeding
としてみなされると判断されます。
let speedLimit = 65 let currentSpeed = 72 let isSpeeding = currentSpeed > speedLimit // currentSpeed is greater than the speedLimit, so isSpeeding is assigned a `true` value
また、!
で表される NOT 論理演算子を使用して Bool
値を逆にすることもできます。
var isSnowing = false if !isSnowing { print("It is not snowing.") }
これは、次のように出力されます。
It is not snowing.
同様に、&&
で表される AND 論理演算子を使用して、2 つ以上の条件が true
であるかどうかをチェックできます。
let temperature = 70 if temperature >= 65 && temperature <= 75 { print("The temperature is just right.") } else if temperature < 65 { print("It is too cold.") } else { print("It is too hot.") }
これは、次のように出力されます。
The temperature is just right.
上記のコードでは、temperature (温度) が両方の条件 (華氏 65 度以上かつ 75 度以下) を満たしています。ちょうど良い温度です。
さらに、もう 1 つオプションがあります。||
で表される OR 論理演算子を使用して、2 つの条件のいずれかが true であるかどうかをチェックします。
var isPluggedIn = false var hasBatteryPower = true if isPluggedIn || hasBatteryPower { print("You can use your laptop.") } else { print("") }
これは、次のように出力されます。
You can use your laptop.
上記の例では、You can use your laptop と出力されます。isPluggedIn
が false でも、hasBatteryPower
が true なので、||
OR 演算子でオプションの 1 つが true であると判断されました。
switch ステートメント
特定の条件に応じて特定のコードブロックを実行できる if
ステートメントと if-else
ステートメントを確認しましたが、ネストした if
ステートメントが乱雑になり、いくつかのオプション以降は読みにくくなる場合があります。Swift には、switch
ステートメントと呼ばれる、もう 1 つのフロー制御のツールがあります。これは、多数の潜在的条件を使用する場合に役立ちます。
基本的な switch
ステートメントは、複数のオプションがある値を取り、各オプション (ケース) に基づいて別個のコードを実行できるようにします。また、default
ケースを指定して、まだ明確に定義していないすべてのケースで実行されるコードブロックを指定することもできます。
車輪数に基づいて乗り物の名前を出力するコードについて考えます。
let numberOfWheels = 2 switch numberOfWheels { case 1: print("Unicycle") case 2: print("Bicycle") case 3: print("Tricycle") case 4: print("Quadcycle") default: print("That's a lot of wheels!") }
定数を numberOfWheels
とし、その値が 1
、2
、3
、4
.のどれなのかに応じて、別個のアクションが提供されます。また、numberOfWheels
がこれらの値以外の場合にもアクションが提供されます。
このコードは、ネストした if
-else
ステートメントとして記述することもできますが、すぐに解析が大変になります。
任意の case
ステートメントで一度に複数の条件を評価することもできます。たとえば、次のコードは、文字が母音かどうかをチェックします。
let character = "z" switch character { case "a", "e", "i", "o", "u" : print("This character is a vowel.") default: print("This character is a consonant.") }
数値を使用する場合は、区間マッチングを使用して範囲内に含まれるかどうかをチェックできます。次のコードスニペットの構文を見てみます。
let distance = 25 switch distance { case 0...9: print("Your destination is close.") case 10...99: print("Your destination is a medium distance from here.") case 100...999: print("Your destination is far from here.") default: print("Are you sure you want to travel this far?") }
多数の異なる条件に基づいて異なるコードを実行する場合、switch
演算子は適切な制御フローです。
3 項演算子
if
ステートメントの面白い (一般的な) 使用事例は、変数を設定する (つまり値を返す) ことです。特定の条件が true
であれば、変数をある値に設定します。特定の条件が false
であれば、変数を異なる値に設定します。
次のコードについて考えてみます。片方の数値がもう片方の数値より大きいかどうかをチェックし、largest
変数に大きい方の値が代入されます。
var largest = 0 let a = 15 let b = 4 if a > b { largest = a } else { largest = b }
この状況はプログラミングでは一般的なので、多くの言語には、より簡潔なコードを記述するために 3 項演算子 (?:
) と呼ばれる特別な演算子が含まれています。
3 項演算子には、次の 3 つの部分があります。
- 回答が
true
またはfalse
になる質問 - 質問への回答が
true
の場合の値 - 質問への回答が
false
の場合の値
次に例を示します。
var largest = 0 let a = 15 let b = 4 largest = a > b ? a : b
コードの最後の行を詳しく見てみましょう。これは、「a > b
の場合、a
を largest
定数に代入する。それ以外の場合は、b
を代入する」と読むことができます。この場合、b
より大きい a
が largest
に代入されます。
Swift では、3 項演算子を使用することは必須ではないのですが、より複雑な if
-else
ステートメントを使用する代わりに条件に基づいて値を代入する、非常に便利な速記方法です。
ラボの終了
Swift を実際に使ってみる準備はできていますか? 課題で学習したことを Lab - Control Flow.playground で練習してください。
テストの前に
独自の方法で演算子についての知識をテストします。以下は、Swift コードのサンプルです。テストで出題される問題では、コードの動作を理解していることを確認するために、このコードを評価する必要があります。ご健闘をお祈りします。
テスト問題 1
var time = 6 if time < 12 { print("Good morning") } else if time < 18 { print("Good afternoon") } else { print("Good evening") }
テスト問題 2
var grade: Character = "F" let score = 78 switch score { case 90...100: grade = "A" case 80...89: grade = "B" case 70...79: grade = "C" case 61...69: grade = "D" default: grade = "F" }