SwiftはScalaに似てる、SwiftはScalaに似てるってずっと感じてたので大きく勘違いしていた。SwiftでTrailing Closureを書きたい場合はCurry化した関数を書く必要はないらしい。
Curried Function in Swift
そもそもSwiftにはCurry化した関数を書くことができることを先に知ったのが発端。
func incrementBy(add: Int)(value: Int)-> Int {
return add + value
}
let f = incrementBy(3)
f(value: 3)
引数を丸括弧で分けていくことで部分適用された関数を書くことができる。
Curried Function in Scala
ScalaではこのCurry化を使ってTrailing ClosureみたいなDSLを書く
def incrementBy(add: Int)(value: Int): Int = add + value
val f = incrementBy(3)_ // このアンダーラインは部分適用された関数オブジェクトを生成するのに必要
f(3)
これをTrailing Closureで書く場合はこんな感じ.
incrementBy(3) {
4
} // -> 7
制御構造に見えるのでDSLっぽい。Trailing Closureもコレと同じようなものだろうと思って書いてみた。
Trailing Closure in Swift
func incrementBy(v1: Int, v2: Int)(op: (Int, Int) -> Int)-> Int {
return op(v1, v2)
}
incrementBy(3, 4) {
$0 + $1
} // -> Error: Extra argument in call
引数多いと怒られる。ちゃんと隅々までドキュメント見ればよかったんだけど例が少なかったので勘違いしたのかもしれない。実はSwiftではCurry化なんて必要なくてClosureを最後の引数で渡すように書くだけで同じことができる。
func incrementBy(v1: Int, v2: Int, op: (Int, Int) -> Int)-> Int {
return op(v1, v2)
}
incrementBy(3, 4) {
$0 + $1
} // -> 7
ちょっと勘違いしていたのでメモ