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

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")
主站蜘蛛池模板: 宜兰县| 武鸣县| 临高县| 三门峡市| 白玉县| 佛山市| 绥化市| 丹东市| 阿巴嘎旗| 潮安县| 莲花县| 乐亭县| 红原县| 常州市| 乌什县| 香港| 榆社县| 沧州市| 织金县| 高尔夫| 长岭县| 深水埗区| 休宁县| 清流县| 临邑县| 岗巴县| 盘锦市| 齐河县| 余干县| 台前县| 小金县| 辰溪县| 增城市| 内黄县| 远安县| 泰安市| 松潘县| 遂宁市| 泾阳县| 大方县| 治县。|