前回はifでしたが、今回はswitchに挑戦してみました。
func `switch`<A: Equatable, B>(_ value: A, cases: [(A, () -> B)], default: @autoclosure () -> B) -> B {
for `case` in cases {
if `case`.0 ~= value {
return `case`.1()
}
}
return `default`()
}
使用例
enum A {
case a, b, c
}
let result = `switch`(A.c,
cases: [(.a, { "AAAAA" }),
(.b, { "BBBBB" }),
(.c, { "CCCCC" })],
default: "")
// result = "CCCCC"
しかし、範囲を指定したswitchは書けません。。。
let result2 = `switch`(43,
cases: [(0 ... 100, { "0" }),
(101 ... 200, { "1" })],
default: { "0000000" })
// エラー
// error: cannot convert value of type '(CountableClosedRange<Int>, () -> _)'
// to expected element type '(_, () -> _)'
// cases: [(0 ... 100, { "0" }),
// ^~~~~~~~~~~~~~~~~~~~
また、default必須なのでなんともいまいちです。
いろいろ改善できそうなので、コメントお待ちしております🙇