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

Currying

Functions and closures don't have to be defined at the top level. This can be unintuitive, when coming from languages such as Objective-C and Java. Swift, like JavaScript, lets you define functions and closures anywhere in your code. Functions can also return functions. This mechanism is known as currying.

Imagine that you want to create a logger method that will print a single argument, but it will always pretend to be a string to find it easily in your logs.

Let's start with the following basic implementation:

private let PREFIX = ‘MyPrefix'

private func log(_ value: String) {
print(PREFIX + “ “ + value)
}

class MyClass {
func doSomething() {
log(“before”)
/* complex code */
log(“after”)
}
}

While this works properly in the scope of a simple class, if you need to reuse the log method or change the internal implementation, this will lead to a lot of duplication.

You can use currying to overcome that issue, as follows:

func logger(prefix: String) -> (String) ->  Void {
func log(value: String) {
print(prefix + “ “ + value)
}
return log
}

let log = logger(prefix: “MyClass”)
log(“before”)
// do something
log(“after”)

// console:
MyClass before
MyClass after
主站蜘蛛池模板: 滦平县| 唐河县| 汶川县| 贺兰县| 康平县| 大竹县| 军事| 新兴县| 奇台县| 赣榆县| 周口市| 辰溪县| 贵阳市| 灵寿县| 屯留县| 伊金霍洛旗| 修文县| 玛曲县| 鲜城| 平度市| 连城县| 沛县| 江源县| 甘南县| 普陀区| 繁昌县| 乐亭县| 庆城县| 泾川县| 小金县| 永丰县| 客服| 洱源县| 平乐县| 九龙城区| 宁夏| 航空| 宾川县| 泰州市| 自贡市| 东乌珠穆沁旗|