【Xcode/Swift】if文について詳しく解説(else-if文、三項演算子、if-let文についても解説)

この記事では、if文について詳しく解説していきたいと思います。

if文とは?

if文というのは、条件分岐処理を書くための文法です。

「if」は「もしも」という意味なので、もしもこのような場合は、このような処理を行う。みたいな感じで条件でやりたい処理が異なる場合に使います。

書き方

if 条件 {
    処理(条件式に当てはまったら実行)
}

と書きます。

条件に当てはまらない場合にも処理を行いたい場合は以下のように書きます。

if 条件 {
    処理(条件式に当てはまったら実行)
} else {
    処理(条件式に当てはまらなかったら実行)
}

と書きます。

if文は、繋げることもできます。以下のようにすることで条件を増やすことができます。

if 条件1 {
    処理(条件1に当てはまったら実行)
} else if 条件2 {
    処理(条件1に当てはまり、さらに2に当てはまったら実行)
} else {
    処理(条件1、2に当てはまらなかったら実行)
}

ちなみに、条件は()で括っても記述できますが、()は省略した方が良いです。

if (条件1) {
    処理(条件1に当てはまったら実行)
} else (if 条件2) {
    処理(条件1に当てはまり、さらに2に当てはまったら実行)
} else {
    処理(条件1、2に当てはまらなかったら実行)
}

あと、条件式とelseの両脇には半角スペースを入れましょう。エラーにはなりませんが、見やすくなります。

if 条件{
    処理(条件式に当てはまったら実行)
}else{
    処理(条件式に当てはまらなかったら実行)
}

if文の使用例

基本的なif文の使い方

例えば、timeという変数があり、その変数が12より小さかったら、「おはよう」と表示させるプログラムだとしたら、

let time: Int = 9

if time < 12 {
    print("おはよう")
}

というふうに書きます。

ではさらに、timeが、12以上かつ、18より小さかったら「こんにちは」と表示させましょう。

if time < 12 {
    print("おはよう")
} else if time < 18 {
    print("こんにちは")
}

というふうに書きます。

ではさらに、timeが18以上の場合、「こんばんは」と表示させましょう。

if time < 12 {
    ptint("おはよう")
} else if time < 18 {
    print("こんにちは")
} else {
    print("こんばんは")
}

というふうに書きます。

Bool型のif文

isMarriedという変数が、trueだった場合、「既婚者です。」と表示させ、falseだったら「独身です。」と表示させるプログラムを作ってみましょう。

let isMarried: Bool = true

if isMarried == true {
    print("既婚者です。")
} else {
    print("独身です。")
}
// 実行結果:既婚者です。

というふうに書きます。

条件式で、Bool型の場合、== trueを省けます。

let isMarried: Bool = true
if isMarried {
    print("既婚者です。")
} else {
    print("独身です。")
}
// 実行結果:既婚者です。

入子構造のif文

if文は、以下のように入れ子にすることもできます。

var time = 13
if time < 18 {
    if time < 12 {
        print("おはよう")
    } else {
        print("こんにちは")
    }
} else {
    print("こんばんは")
}
// 実行結果:こんにちは

ただ、入れ子にすしすぎると、読みにくくなってしまいますので、なるべく3個以上の入れ子はしないようにしましょう。

AND、ORを使用した複数条件のif文

ANDの意味の&&や、ORの意味の||を使うことで、一つのif文で複数の条件にすることができます。

let age = 25
let gender = "男性"
if age < 20 && gender == "男性" {
    print("成人男性です。")
}
// 実行結果:成人男性です。

三項演算子(中級者以上)

三項演算子というのを使うと、if文をもっと簡潔に書くことができます。上記のプログラムの場合だと以下のように書きます。

let isMarried: Bool = true
isMarried ? print("既婚者です。") : print("独身です。")
// 実行結果:既婚者です。

たった1行で書くことができます。詳しくはこちら

if-let文(中級者以上)

if文でオプショナルバインディングができます。

条件式を、値があるかどうか判断します。以下のように記述します。

if let 変数名 = オプショナル型の値 {
    処理(値が存在したら実行)
} else {
    処理(値が存在しなかったら実行)
}

bというオプショナルの変数があり、bが存在した場合実行、存在しなかった場合は実行しないというプログラムを書くとなると以下のように書きます。

let optionalA: Int? = 1

if let a = optionalA {
    print("optionalAは存在します。")
} else {
    print("optionalAは存在しません。")
}
// optionalAは存在します。

さらに、複数の値でも使えます。

let optionalA: Int? = 1
let optionalB: Int? = 2

if let a = optionalA, let b = optionalB {
    print("aとbは存在します。")
} else {
    print("aとbのどちらかまたは、どちらもは存在しません。")
}
// aとbは存在します。

else ifを使わない方がいい理由

初心者が使いがちなelse ifですが、中級者以上の方はelse ifを嫌います。

なぜか。それは読みにくく、追うのが大変でバグが起きやすいからです。

例えば、以下の処理を見てみてください。

if gender == "男性" {
    print("男性です。")
} else if gender == "女性" {
    print("女性です。")
} else {
    print("その他です。")
}

これは読みにくいですよね。一番最後のelseが実行されるのを確認するには、一番上のif文から見て行かないとelseに入る条件がわからないです。

じゃあどうするのかというと、else ifを書かないで別々に書きます。

if gender == "男性" {
    print("男性です。")
}
if gender == "女性" {
    print("女性です。")
}
if gender == "その他" {
    print("その他です。")
}

ただ、これだと、パフォーマンスがよくないです。男性だった場合、上記のelse ifで書いた場合は、一番上のif文だけを判定すれば終わります。しかし、このif文は、男性の場合でも3回の判定を行なってしまいます。そのため、パフォーマンスが悪くなってしまいます。

じゃあどうするのかというと、早期リターンをします。判定結果が出たらすぐにreturnするということです。

if gender == "男性" {
    print("男性です。")
    return
}
if gender == "女性" {
    print("女性です。")
    return
}
if gender == "その他" {
    print("その他です。")
}

こうすることで、else ifと同じパフォーマンスで、見やすいコードが書けました。ただ、コード量が多くなってしまうので、3つ以上のif文を使うくらいなら、Switch文を使うのがおすすめです。Switch文の方がパフォーマンスも良いらしいですし。