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

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
主站蜘蛛池模板: 新余市| 涿州市| 开江县| 峡江县| 连平县| 大城县| 延川县| 栾川县| 东乌珠穆沁旗| 灵璧县| 镇原县| 惠安县| 贵德县| 太康县| 太保市| 郴州市| 江油市| 卢氏县| 开鲁县| 宁德市| 房产| 徐闻县| 新疆| 达孜县| 鄂尔多斯市| 京山县| 东源县| 梁平县| 都兰县| 巧家县| 南郑县| 红河县| 罗定市| 永胜县| 罗源县| 松溪县| 乌兰察布市| 伊春市| 山东省| 仪征市| 紫云|