解答例
var heights: [Int] = [3, 7, 1, 11, 5, 15, 2, 2, 8, 4, 1, 7]
let allCoordinates = world.allPossibleCoordinates
var index = 0
for coordinate in allCoordinates {
if index == heights.count {
index = 0
}
for i in 0...heights[index] {
// ブロックを置きます。
world.place(Block(), at: coordinate)
}
// インデックスを1増やします。
index += 1
}
解説
インデックスの範囲外エラーを避ける方法を学びます。
heights配列の中には、積み重ねたいブロックの数を適当に入れていきます。
例えば、今回は1〜15の数字を入れていますが、これは何の数字でもOKです。
実行してみると、1段のブロックの場所もあれば、15段の場所もあります。
重要なのは、インデックスについての考え方です。
最初に書いてある『3』に対するインデックスは『0』で、
次の『7』のインデックスは『1』ですね。
このように、順番に数えてみると、最後の『7』のインデックスは『11』になります。
整数の数は『12』個ありますが、インデックスは0から数え始めるため、
最後のインデックスが『11』になる点に注意してください。
このように整数の数を数えて以下の条件を指定してもいいのですが、
例にあるように
if index == heights.count {
index = 0
}
のようにしておくと、heightsの配列の数をカウント(count)してくれて、
配列の数(この場合は12)に達するとインデックスを0に戻します。
index == heights.count
つまり、インデックス12ということですが、配列に無いので、実行しようとするとエラーになります。
なのでその場合はif文の中でindex = 0
とします。
indexが0になると、index += 1
で
また配列のindex0、index1、index2、、、と実行していきます。
index0〜index11を、繰り返していくわけです。
forループを使っているので最終的に『全ての配列』にブロックが積まれることになります。
配列の中には、どんな整数を入れてもゴールできますよ。
・インデックスの範囲外エラーにならないように、if文を使ってインデックスの数を条件にして、範囲を超えないようにしよう