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

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")
主站蜘蛛池模板: 辰溪县| 册亨县| 高唐县| 台中县| 仁寿县| 南川市| 霍邱县| 深泽县| 芦山县| 黄浦区| 吉木乃县| 西宁市| 贵州省| 南康市| 白沙| 哈尔滨市| 宁南县| 潜江市| 若羌县| 林甸县| 沁阳市| 焉耆| 永泰县| 胶州市| 黎平县| 离岛区| 玉树县| 五原县| 灌云县| 临清市| 龙游县| 霍山县| 洪洞县| 琼中| 哈巴河县| 鄂温| 天水市| 万山特区| 保德县| 陈巴尔虎旗| 齐河县|