Swift Playgrounds

コードを学ぼう2【インデックスの範囲外エラーを直す】解答例と解説

インデックスの範囲外エラーを直す

解答例

var teamBlu: [Character] = []

// 配列にBluのインスタンスが何個含まれるか数えてみてください。
for i in 1...9 {
  teamBlu.append(Character(name: .blu))
}

// 行4の各列にBluを置きます。
var columnPlacement = 0

for blu in teamBlu {
  world.place(blu, at: Coordinate(column: columnPlacement, row: 4))
  columnPlacement += 1
}

// インデックスの範囲外エラーを見つけてください。
teamBlu[ 0 ].jump()
teamBlu[ 2 ].collectGem()
teamBlu[ 4 ].jump()
teamBlu[ 6 ].collectGem()
teamBlu[ 8 ].jump()

解説

インデックスの範囲外エラー、つまり、インデックスの項目にないものを選択してしまうと、
アプリケーションが実行できなくてエラーを起こしてしまうことですね。

インデックスについて、少し思い出してみます。
アイスクリームサンデーを作る手順です。

項目[バニラアイスクリーム, バナナ, チョコレート, さくらんぼ]

このように同じ型の複数の項目を[]に入れて、各項目を『,』で区切ります。
そうすると、最初の項目がインデックス0となり、順番に数字が割り当てられます。

インデックス0: バニラアイスクリーム
インデックス1: バナナ
インデックス2: チョコレート
インデックス3: さくらんぼ

この『項目』を実行すると、順番にそれぞれが操作されていきます。
そして、この中の、例えばインデックス2だけを操作したい場合も、
メソッドを使って削除したりなどすることができます。

材料.remove(at: 2)

こうすると、インデックス3にあった『さくらんぼ』が、インデックス2に移動し、
インデックス3の項目がなくなります
このような時、うっかり、『さくらんぼ』をインデックス3と勘違いして

材料.remove(at: 3)

などとして、何らかの処理を与えてしまうと、インデックス3の場所には何もないので
範囲外エラーになってしまいます。
インデックスは、ずっと同じ番号が割り振られるわけではなく
削除したり追加したりするたび、変化するので注意が必要です。
あとは、『0』から始まるので
ついつい『1番目の材料は・・・』と考えてインデックス1としてしまうと、
実は2番目の材料だったりするので、そこも注意です。

今回の課題は、インデックスの範囲外エラーを見つけるだけなので、簡単かもしれませんね。
4行目の全てにBluを置きましたが、
teamBluの中にインデックス[10]はありません。
無いのに実行しようとすると、エラーになってしまいます。
最後のコードだけ消せばOKですね。
ゴールすると、以下のメッセージが出ます。

バグを見つけて直す作業は、コーディングには欠かせません。
インデックスの範囲外エラーは、アプリケーションが動かなくなってしまう原因として、よくあるバグの1つです。
コードを書く時は、配列の中にない項目を取り出そうとしていないか、よく確かめましょう。

このようになりました。
配列の範囲外エラーを直す

要点まとめ

・配列の項目を追加または削除すると、その後ろにある全てのインデックスが変わる