8×8の64マスの座標をallCoordinates配列に入れて、for〜in文で1つ1つについてチェックをして、条件に当てはまるものを別のblockSetという配列に追加し、最後にblockSetの中身1つ1つについてまたfor〜in文でループしてブロックを積み上げていきます。
このステージでの目新しいテクニックは、2つ。
1つは、coodinate.columnとかcoodinate.rowでCoodinate型オブジェクトがもっているcolumnやrowといった値(メンバー変数と呼んだりします)を取り出せる点です。ドット記法は色々な意味があってややこしいですね。一般に、
1 |
expert.moveForward() |
のように最後に()がついている場合は、そのオブジェクトになんらかの処理(メソッド)を実行させる意味で、
1 |
coodinate.column |
のように()がついていないものは、オブジェクトが中にもっている変数(メンバー変数)を指していると思えばよいでしょう。英語なのが難点ですがその意味からなんとなくイメージすることもできることが多いです。
2つめは、配列に対して要素を追加する.append()メソッドです。以前、.insert()というのも出てきましたが、それと違い、単純に最後に付け足すというものです。
1 |
(配列名).append((追加したいオブジェクト)) |
今配列内に要素がいくつあるか気にしなくて良いので、うっかり範囲外エラーを出してしまう心配もなくお手軽ですね。配列の中での順番が重要ではない場合は、.insert()より.append()がオススメです。
その2点を踏まえて正解例をご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
let allCoordinates = world.allPossibleCoordinates //全マスの座標をallCoordinatesにセット var blockSet: [Coordinate] = [] //blockSetという名前でCoordinate型のオブジェクト用の空の配列を用意 //allCoordinates配列の中身が順番にcoodinateという名前でセットされループを処理 for coordinate in allCoordinates { // Check for coordinates with a column > 5 OR a row < 4. // (各座標の列が5より大きく、行が4より小さいかチェック) if coordinate.column > 5 || coordinate.row < 4 { //ドット記法.column、.rowでcoordinateの列番号、行番号を読み出せる // Append coordinate to blockSet. // 対象の座標を配列blockSetに追加 blockSet.append(coordinate) } } // For each coordinate in blockSet, place 6 blocks. // (blockSetの中のそれぞれの座標に、6つずつブロックを配置) for coordinate in blockSet { //ブロックを同じ座標に6段置いていくには単純に6回ずつ実行 for i in 1 ... 6 { world.place(Block(), at: coordinate) } } |
いまいち何をしているのかわかりづらいので、正解例コードを実行した時の結果も画像で載せておきます。