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

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")
主站蜘蛛池模板: 繁昌县| 曲水县| 六枝特区| 崇明县| 上林县| 保定市| 新安县| 鄂伦春自治旗| 互助| 巢湖市| 炉霍县| 黔江区| 玉树县| 科技| 鄂伦春自治旗| 威海市| 龙陵县| 柞水县| 竹溪县| 柳州市| 固始县| 九龙坡区| 禹州市| 寿阳县| 乌鲁木齐县| 高雄县| 科尔| 甘洛县| 东阿县| 永德县| 广丰县| 平谷区| 苏尼特左旗| 淮阳县| 贵德县| 昔阳县| 汉川市| 叙永县| 巴彦淖尔市| 秦安县| 义马市|