制御フロー【Swiftイントロダクション・第2回】

条件文はifとswitchを使って表示します。ループはfor-in, for, while, repeat-whileを使います。条件やループで使われる変数に括弧()をつける必要はありませんが、条件内やループ内には必ず波括弧{}をつける必要があります。

let scores = [75, 43, 103, 87, 12]
var teamScore = 0

//scoreに(score)のように括弧をつけて表示する必要はない
for score in scores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

スクリーンショット

If文の中の条件は必ずBoolean式にしなければいけません。条件の結果が暗示的に0と比べられることはないので、if score {…} のようなコードはエラーとなります。

スクリーンショット

値が入っていないかもしれない値はifとletを合わせて処理することができます。このような、値が入っていないかもしれない値をオプショナルと呼びます。オプショナル値には、値が含まれている場合もありますし、値が含まれていない(nil)の場合もあります。(nilは値がないことを示します。)値がオプショルの値であることを示すには型の後ろにクエスチョンマーク(?)を書きます。

var optionalString: String? = "Hello"
print(optionalString == nil)

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
//optionalNameがnilだった場合は波括弧の中は実行されない
if let name = optionalName {
    //optionalNameがnilでない場合はnameにoptionalNameの値が代入される
    greeting = "Hello, \(name)"
}

上記のコードでは、もしオプショナル値(optionalName)がnilだった場合には、if文の条件はfalseになり、波括弧の中のコードはスキップされるので実行されません。オプショナル値がnilでない場合には、オプショナル値はアンラップされてletの値に代入され、波括弧の中で使われるようになります。上記のコードではoptionalNameがアンラップされてoptionalNameの値である”John Appleseed”がnameに代入されています。 スクリーンショット

オプショナル値を扱うもう一つの方法は??演算子を使ってデフォルトの値を用意しておく方法です。もしオプショナル値がnilの場合は、デフォルト値が使われます。

let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"

スクリーンショット

Switch文は様々なデータ型や比較演算子に対応しています。

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}

値がcaseの条件と一致した場合は、letを使って値をそのまま定数に代入できることに注目してください。 スクリーンショット 上記のコードでは、vegetable(“red pepper”)の接尾辞がpepperですので、case let x where x.hasSuffix(“pepper”)と条件がマッチしています。 print(“Is it a spicy (x)?”)の部分ではvegetableの値がそのままxとして使われていますので、”Is it a spicy red pepper?”が結果としてプリントされます。

値に一致するcase文のコードが実行された後は、プログラムはswitch文から抜けます。次のcase文のコードが実行されることはないので、それぞれのcaseの最後で明示的にbreakを記述する必要はありません。

for-inループを使って、辞書のキーと値に名前をつけていくことで、辞書の中身を繰り返すことができます。辞書は順序を持っていないので、キーと値の順序は初期化した順番通りになるわけではなく、ランダムになります。

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}

print(largest)

スクリーンショット

whileは条件が変わるまでコードブロックを繰り返す時に使います。ループが最低一回は必ず実行されるようにしたい場合には、条件文をループの最後に記述します。

var n = 2
while n < 100 {
    n = n * 2
}

print(n)

//条件文をループの最後に記述して最低一回はコードブロックの中が実行されるようにする
var m = 2
repeat {
    m = m * 2
} while m < 100

print(m)

スクリーンショット インデックス(ループ回数)の範囲を指定してループさせるには..<を使います。

var total = 0
for i in 0..<4 {
    total += i
}

print(total)

スクリーンショット

..<では大きい方の値が含まれませんので、大きい方の値も含めたい場合には...を使います。

スクリーンショット