リバーシというのはオセロのことですが、オセロは商標なのでここではリバーシと呼びます。
リバーシのボードは 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))
...
}
...
}