
この世でいちばんわかりやすいiPhoneアプリ開発のおはなし【Range型を学ぶ】
1から10までの整数をひとつずつ足し算していくと、合計は55です。 この計算過程をコンソールに出力してみましょう。
var sum = 0
sum += 1
print(sum) // 1
sum += 2
print(sum) // 3
sum += 3
print(sum) // 6
sum += 4
print(sum) // 10
上のコードはまだ途中ですが、10までの足し算をすべてコードにするのは面倒です。 この処理は、ループ構文を使って簡潔に記述できます。
for number in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] {
sum += number
print(sum)
}
このループ構文において、反復対象である「1から10までの整数」は、ある一定の範囲を示しています。 しかしながら、このコードは「1から10までの整数」がひとつも欠落していないか、心配になります。
Swiftプログラミングにおいて、整数の範囲はRagne型として表現することができます。
1...10 // OK
7...2 // error
Range型が示す範囲は、常に「終了値が開始値よりも大きくなる」ように指定します。
Range型の値は、For-inループの反復対象として利用可能です。
for number in 1...10 {
sum += number
print(sum)
}
「1から10までの整数」を繰り返すことが、より直感的に伝わるコードを記述できました。
整数の範囲は、配列のインデックスを指定する添え字として利用することもできます。
let week = ["Monday", "Tuesday", "Wednesday", "Tursday", "Friday", "Saturday", "Sunday"]
week[2...5] // ["Wednesday", "Tursday", "Friday", "Saturday"]
上のコードは、配列の添え字に範囲を指定して、配列から「一連の要素」を取り出しています。
配列の添え字として範囲を指定する場合、開始あるいは終了の値を省略できます。
week[...2] // ["Monday", "Tuesday", "Wednesday"]
week[5...] // ["Saturday", "Sunday"]
このように範囲の片側だけを省略すると、可能な限り一方向に続く範囲を作成できます。
終了値を含まない範囲
整数の範囲は、配列に対してループ処理を行う場合に便利です。
ここでは、太陽系の惑星を示す配列を考えてみましょう。
let planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn"]
planets.count // 6
上のコードは、インデックスが0から5まであり、要素が6個の配列を示しています。
配列のインデックスをループ処理で使いたい場合、繰り返し回数に範囲を指定できます。
for index in 0...5 {
print("Planet#\(index + 1): \(planets[index])")
}
// #1: Mercury
// #2: Venus
// #3: Earth
// #4: Mars
// #5: Jupiter
// #6: Saturn
上のコードは、配列に含まれる全ての惑星をその順番と共に出力します。
しかしながら、配列に要素が追加されると、繰り返し回数も増やす必要があります。 あるいは、配列から要素が削除されると「無効なインデックス」を参照して実行時にエラーが発生します。
planets.append("Uranus")
for index in 0...5 {
print("#\(index + 1): \(planets[index])")
}
// #1: Mercury
// #2: Venus
// #3: Earth
// #4: Mars
// #5: Jupiter
// #6: Saturn
上のコードを実行しても、ループ回数が以前のままなので、配列に追加された「天王星」が出力されません。 「配列の要素数」と同じ分だけ繰り返すループを構築できれば、解決できます。 かといって、繰り返し回数に「配列のcountプロパティ」を使用すると、無効なインデックスを参照してエラーが発生します。
for index in 0...planet.count {
print("#\(index + 1): \(planets[index])")
}
// Runtime error
このような場合、「終了値を含まない範囲」演算子..<を使用できます。
2...6 // 2, 3, 4, 5, 6
2..<6 // 2, 3, 4, 5
「終了値を含まない範囲」を使用することで、繰り返し回数に「配列の要素数」を指定できます。
for index in 0..<planets.count {
print("Planet#\(index + 1): \(planets[index])")
}
// #1: Mercury
// #2: Venus
// #3: Earth
// #4: Mars
// #5: Jupiter
// #6: Saturn
// #7: Uranus
上のコードを実行すると、追加された「天王星」が出力されます。 このループは、配列の要素数と同じだけ繰り返すので、要素が増減しても問題なく動作します。