官术网_书友最值得收藏!

Function currying

Function currying translates a single function with multiple arguments into a series of functions each with one argument. Let's examine an example.

Suppose that we have a function that combines firstName and lastName to return the full name as follows:

func extractFullName(firstName: String, lastName: String) -> String { 
return "\(firstName) \(lastName)"
}

This function could be translated into a curried function as follows:

func curriedExtractFullName(firstName: String)(lastName: String) -> String { 
return "\(firstName) \(lastName)"
}

As seen from this example, we replace the comma with ) ( parentheses. So now we can use this function as follows:

let fnIncludingFirstName = curriedExtractFullName("John") 
let extractedFullName = fnIncludingFirstName(lastName: "Doe")

Here, fnIncludingFirstName will already have firstName in it so that, when we use it, we can provide lastName and extract the full name.

Starting with Swift 2.2, Apple deprecated function currying and removed it from Swift 3.0. We can convert the function currying to returning a closure explicitly:

// Before: 
func curried(x: Int)(y: String) -> Float {
return Float(x) + Float(y)!
}

// After:
func curried(x: Int) -> (String) -> Float {
return {
(y: String) -> Float in
return Float(x) + Float(y)!
}
}

Let's convert our curried function to return the closure version explicitly:

func explicityRetunClosure(firstName: String) -> (String) -> String { 
return {
(lastName: String) -> String in
return "\(firstName) \(lastName)"
}
}

We can use this function as follows and the result is going to be identical:

let fnIncludingFirstName = explicityRetunClosure(firstName: "John") 
let extractedFullName = fnIncludingFirstName("Doe")
主站蜘蛛池模板: 临沭县| 固始县| 崇信县| 无棣县| 永德县| 顺平县| 长汀县| 徐州市| 台安县| 额尔古纳市| 科技| 读书| 长顺县| 济阳县| 安泽县| 镇远县| 慈利县| 固始县| 海安县| 天气| 明光市| 裕民县| 根河市| 大渡口区| 林周县| 屏东市| 遂昌县| 察隅县| 静海县| 堆龙德庆县| 淮阳县| 集贤县| 宁海县| 永安市| 马边| 江川县| 辉南县| 松江区| 金昌市| 衢州市| 阿合奇县|