15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Swift】Swift5.9のIfステートメント

Last updated at Posted at 2023-09-14

この記事は何?

Appleの開発者向けドキュメント「Swift Programming Language」について、5.9版で内容が追加されたIf条件分岐構文の章を独自に翻訳・解説する。

ある条件に基づいて、実行するコードを選択できると便利なことが多い。
例えば、エラーが発生したときにだけ余分なコードを実行したり、値が適正範囲を超えたらメッセージを表示したりする。
これを行うには、一部のコードに条件を設定する。

Swiftには、コードに条件を付けて実行フローの分岐を追加する方法が2つある。
ifステートメントとswitchステートメント。
ifステートメントは想定される結果からなる、いくつかの単純な条件を評価する。
switchステートメントはより多くの複雑な条件を評価する場合に適している。
また、switchステートメントは適切な実行コードの分岐を選択するために、パターンマッチングを利用できる。

Ifステートメント

最も単純なifステートメントは、条件がひとつだけ。
その条件がtrueである場合にのみ、一連のステートメントを実行する。

単純なifステートメントの例
var temperatureInFahrenheit = 30    // 華氏温度は30度

// 温度が`32`度以下であるかどうかをチェックするifステートメント
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
}
// "It's very cold. Consider wearing a scarf."が出力される

上記のifステートメントは、温度が華氏32度(水の凝固点)以下なら、メッセージが出力する。
それ以外の場合はメッセージを出力せずに、ifステートメントの終了括弧{}の後に続くコードが実行される。

条件がfalseの場合にコードを実行するために、ifステートメントにelse句のステートメントを提供できる。
else句のステートメントは、elseキーワードで示す。

temperatureInFahrenheit = 40    // 40度に上昇

// else句のあるifステートメント
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else {
    print("It's not that cold. Wear a T-shirt.")
}
// "It's not that cold. Wear a T-shirt."が出力される

2つの分岐のうち、いずれか1つが必ず実行される。
気温が40度に上昇したため、スカーフの着用を勧めるほど寒くなくなった。
その結果、else句のステートメントが実行されるようになった。

ifステートメントを連鎖して、評価する条件を追加できる。

if-else ifステートメント
temperatureInFahrenheit = 90

// 「32度以下か、86度以上か、それ以外か」を評価するifステートメント
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
    print("It's really warm. Don't forget to wear sunscreen.")
} else {
    print("It's not that cold. Wear a T-shirt.")
}
// Prints "It's really warm. Don't forget to wear sunscreen."

暖かい温度に対応するために、ifステートメントが追加された。
最後のelse句はあまり暖かくも寒くもない、それ以外の温度に応答する。

なお、最後のelse句は必須ではなく、不要なら除外できる。

temperatureInFahrenheit = 72
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
    print("It's really warm. Don't forget to wear sunscreen.")
}

ifまたはelse ifの条件を引き起こすには寒すぎでも熱すぎでもない温度なので、メッセージは出力されない。

Swiftは、値を設定するときに使用できる「ifの省略記法」がある。
以下に、コードの例に挙げる。

let temperatureInCelsius = 25
let weatherAdvice: String    // 既定値を未設定

// 条件に基づいて、weatherAdviceの既定値を設定する
if temperatureInCelsius <= 0 {
    weatherAdvice = "It's very cold. Consider wearing a scarf."
} else if temperatureInCelsius >= 30 {
    weatherAdvice = "It's really warm. Don't forget to wear sunscreen."
} else {
    weatherAdvice = "It's not that cold. Wear a T-shirt."
}

print(weatherAdvice)
// Prints "It's not that cold. Wear a T-shirt."

ifステートメントの各分岐で、後に出力されるweatherAdvice定数の値を設定する。

if式を使用して、このコードをより手短に記述する。

定数weatherAdviceに既定値を設定するif式
let weatherAdvice = if temperatureInCelsius <= 0 {
    "It's very cold. Consider wearing a scarf."
} else if temperatureInCelsius >= 30 {
    "It's really warm. Don't forget to wear sunscreen."
} else {
    "It's not that cold. Wear a T-shirt."
}

print(weatherAdvice)
// Prints "It's not that cold. Wear a T-shirt."

このif式は、各分岐に1つの値がある。
条件がtrueの分岐コードが、定数weatherAdviceに値を割り当てるためのif式として使用される。
すべてのif節には対応するelse if節またはelse節がある。
そして、どの条件がtrueになるかに関係なく、いずれかの分岐が必ず一致して、if式が常に値を設定できるようにする。

割り当て構文はif式の外側から始まっている。
各分岐でweatherAdvice =を何度も記述する必要がない。
if式の各分岐で、定数weatherAdviceに設定可能な値のいずれかを生成し、その値を割り当てる。

if式の分岐はすべて、値が同じ型であること。
Swiftは各分岐の型を別々にチェックする。
そのため、複数の型で使用できるnilのような値では、Swiftがif式の型を自動的に決定できない。
そのような場合、型を明示する。

// if式がオプショナルなので、定数がString?型であることを明示する
let freezeWarning: String? = if temperatureInCelsius <= 0 {
    "It's below freezing. Watch for ice!"
} else {
    nil
}

上記のif式について、最初の分岐は文字列だが、else節はnil
nilは任意のオプショナル型の値として使用できるので、「定数freezeWarningString?型である」ことを明示する必要がある。
これは、型アノテーションで説明されている。

別の方法として、定数freezeWarningに型を明示するのではなく、nilに型を明示することもできる。

// 定数freezeWarningに型アノテーションはない
let freezeWarning = if temperatureInCelsius <= 0 {
    "It's below freezing. Watch for ice!"
} else {
    nil as String?    // asで型を指定
}

以下の例では、if式でエラーをスローしたり、fatalError(_:file:line:)関数を呼び出す。
こうすることで、予期しない失敗に応答できる。

エラーをスローするif式
// 温度が100度より高いと、沸騰エラーをスロー
let weatherAdvice = if temperatureInCelsius > 100 {
    throw TemperatureError.boiling
} else {
    "It's a reasonable temperature."
}

このif式は、温度が100°C(水の沸点)よりも熱いかどうかをチェックする。
この温度が熱いと、if式はテキストを返す代わりに.boilingエラーをスローする。
if式はエラーをスローするが、tryを付けない。
エラーの処理については、エラー対処を参照。

if式は定数および変数に値を割り当てる時だけでなく、関数またはクロージャが返す値としても使用できる。

15
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?