Junkor

Currying

文章翻译自objc,原文连接:『Currying

把一个多参数函数转换成多个单参数的过程叫作「Currying」。例如有这样一个函数,它有三个参数:

func login(email: String, pw: String, success: Bool -> ())

我们可以用Swift专门提供的语法转变成:

func curriedLogin1(email: String)(pw: String)(success: Bool -> ())

更有意思的是,你还可以把currying的过程封装成一个函数。下面这个就是用来处理3个参数的,当然你可以声明类似的函数来处理任意数量的参数:

func curry<A, B, C, R>(f: (A, B, C) -> R) -> A -> B -> C -> R {
	return { a in { b in { c in f(a, b, c) } } }
}

let curriedLogin2 = curry(login)

现在,我们便可以一个一个的使用参数了:

let f = curriedLogin2("foo")("bar")
f { println("success: \($0)") }

你可以在任何时候使用这种方式,不过要注意一点:『在swift中,当你currying实例函数时,默认实例本身是第一个参数』(译者:就好比objective-C中实例函数都会隐式传递self和_cmd一样)