配列の各部屋には
1 |
let columns = [0, 1, 2, 3, 4, 5] |
のように整数を入れるだけでなく、様々な型のオブジェクトを入れることができます。
このステージでは列番号と行番号をひとまとまりにしたCoordinate(座標)型というオブジェクトを配列に格納します。ちょっと入れ子のようでややこしいですが、「カンマで区切られた数だけ、同じ型のものが順番に入れられる」という意味では整数の時と全く同じなので気を楽にしてください。
まずは正解例はこんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Add the two remaining corner coordinates. // (残り2つの角の座標を追加してください) var blockLocations = [ Coordinate(column: 0, row: 0), Coordinate(column: 3, row: 3), Coordinate(column: 0, row: 3), Coordinate(column: 3, row: 0), ] // Place 5 blocks at each coordinate. // (それぞれの座標に5つのブロックを積み上げてください。) for coordinate in blockLocations { for i in 1 ... 5 { world.place(Block(), at: coordinate) } } |
3行目から8行目は長いので改行していますが、[]でひとまとまりで、4つのCoodinate型オブジェクトをblockLocationsという名前の配列に入れていることになります。
もしピンとこなければこういうコードで考えてみてください。
1 2 3 4 5 6 |
var coodinate1 = Coordinate(column:0, row:0) var coodinate2 = Coordinate(column:3, row:3) var coodinate3 = Coordinate(column:0, row:3) var coodinate4 = Coordinate(column:3, row:0) var BlockLocations = [coodinate1,coodinate2,coodinate3,coodinate4] |
正解例コードの14行目でもやっていますが、「後で名前で参照できなくて良いオブジェクトはいきなり型名を指定してもOK」でしたよね。「ステージを作る」章の「階段を置く」で出てきた省略記法です。これと同じことをすると、上のコードは、正解例コードの3〜8行目のように書けるわけです。
ということで、blockLocationには4箇所の座標(ステージの4隅)を示す4つのCoordinate型オブジェクトが入りました。これをfor〜in文を使って繰り返します。blockLocation配列から1つずつ取り出されてcoodinateという名前でループ内で利用可能になるので、13行目のworld.place文でat:パラメーターの中身が置き換えられます。最初のループでは、
1 |
world.place(Block(), at: Coordinate(column: 0, row: 0)) |
としたのと同じことになります。2ループ目は
1 |
world.place(Block(), at: Coordinate(column: 3, row: 3)) |
ですね。