リバーシというのはオセロのことですが、オセロは商標なのでここではリバーシと呼びます。
リバーシのボードは 8 × 8 の 64 のマスがあり、そこにディスクを置いていきます。ですので、 Board
型を作って下記のように subscript
に x
と y
を渡して Disk
を取得したくなります。もしそのマスにディスクが存在しない場合は nil
を返します。
let disk: Disk? = board[x, y]
しかし、このとき、 x
や y
に負の数や 8 以上の数を渡すとエラーになるはずです。そのエラーをどのように表すか考えてみて下さい。
x
や y
がボードからはみ出した場合には、ディスクがなかったとき同様に nil
を返すようにします。
struct Board {
subscript(x: Int, y: Int) -> Disk? {
guard (0..<8).contains(x) else { return nil }
guard (0..<8).contains(y) else { return nil }
...
}
...
}
ボードからはみ出してしまった場合をハンドリングすることはできないとして、 fatalError
でクラッシュさせます。
struct Board {
subscript(x: Int, y: Int) -> Disk? {
guard (0..<8).contains(x) else { fatalError() }
guard (0..<8).contains(y) else { fatalError() }
...
}
...
}
同じく回復不能ですが、 precondition
でチェックして、コードのミスとしてコードの修正を促します。
struct Board {
subscript(x: Int, y: Int) -> Disk? {
precondition((0..<8).contains(x))
precondition((0..<8).contains(y))
...
}
...
}