LoginSignup
8
8

More than 5 years have passed since last update.

Trailing Closures and Curried function

Last updated at Posted at 2014-06-16

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

ちょっと勘違いしていたのでメモ

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8