見出し画像

今でしょ!Swift - 制御フロー(if)

条件文

ある特定の条件に基づき処理を変更した場合は条件文を使います。

Swift は、条件により処理を変更する場合にはif 文と switch 文が使えます。一般的に、if 文は、シンプルな条件の時、switch 文は、様々な可能性の組み合わせを持つ、より複雑な条件に適し、パターンマッチなど役に立ちます。

If

シンプルな形式の if 文は 条件が一つのものです。条件が true の場合にのみ、内部の文が実行されます。

var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32 {
    print("とても寒いですね。マフラーを巻いたほうがいいでしょう。")
}
// とても寒いですね。マフラーを巻いたほうがいいでしょう。

falseの場合の条件を追加することができます。

else   ・・・ 追加して処理を書きます。

temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
    print("とても寒いですね。マフラーを巻いたほうがいいでしょう。")
} else {
    print("そんなに寒くありません。Tシャツを着ましょう。")
}
// そんなに寒くありません。Tシャツを着ましょう。

falseの場合でさらに条件分岐。

else if

temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {
    print("とても寒いですね。マフラーを巻いたほうがいいでしょう。")
} else if temperatureInFahrenheit >= 86 {
    print("とても暖かいですね。日焼け止めを忘れずにしましょう。")
} else {
    print("そんなに寒くありません。Tシャツを着ましょう。")
}
// とても暖かいですね。日焼け止めを忘れずにしましょう。

定数に入れといて、あとで出力することもできます。

let temperatureInCelsius = 25
let weatherAdvice: String

if temperatureInCelsius <= 0 {
    weatherAdvice = "とても寒いですね。マフラーを巻いたほうがいいでしょう。"
} else if temperatureInCelsius >= 30 {
    weatherAdvice = "とても暖かいですね。日焼け止めを忘れずにしましょう。"
} else {
    weatherAdvice = "そんなに寒くありません。Tシャツを着ましょう。"
}

print(weatherAdvice)
// "そんなに寒くありません。Tシャツを着ましょう。"

もっと簡単に

let weatherAdvice = if temperatureInCelsius <= 0 {
    "とても寒いですね。マフラーを巻いたほうがいいでしょう。"
} else if temperatureInCelsius >= 30 {
    "とても暖かいですね。日焼け止めを忘れずにしましょう。"
} else {
    "そんなに寒くありません。Tシャツを着ましょう。"
}

print(weatherAdvice)
// "そんなに寒くありません。Tシャツを着ましょう。"

if 式では型を判別して実行されていていますが値が"nil"の場合は自動で判定ができません。明示的に型を指定する必要があります。

let freezeWarning: String? = if temperatureInCelsius <= 0 {
    "氷点下です。氷に注意しましょう!"
} else {
    nil
}

上のコードでは、if 式の一方の分岐に String 値が、もう一方の分岐に nil 値が設定されています。nil 値は任意のオプショナル型の値として使うためfreezeWarning がオプショナルの文字列であることを明示的に記述する必要があります。

別の方法として、freezeWarning に明示的な型を提供する代わりに、nil に明示的な型を提供することができます

let freezeWarning = if temperatureInCelsius <= 0 {
    "氷点下です。氷に注意しましょう!"
} else {
    nil as String?
}

if 式は、予期せぬ失敗に対して、エラーを投げたり、fatalError(_:file:line:) のように、戻り値を返さない関数を呼び出して対応することができます。例えば、次のようなものです

let weatherAdvice = if temperatureInCelsius > 100 {
    throw TemperatureError.boiling
} else {
    "適度な気温ですね。"
}

この例では、if 式は予報気温が 100°C(水の沸点)より高いかどうかをチェックします。これほど高温になると、if 式はテキストの要約を返す代わりに、.boiling エラーを投げることになります。


この記事が気に入ったらサポートをしてみませんか?