- Hands-On Design Patterns with Swift
- Florent Vilmart Giordano Scalzo Sergio De Simone
- 220字
- 2021-07-02 14:44:59
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
推薦閱讀
- 大規模數據分析和建模:基于Spark與R
- 信息系統與數據科學
- 算法與數據中臺:基于Google、Facebook與微博實踐
- 區塊鏈:看得見的信任
- 城市計算
- 智能數據時代:企業大數據戰略與實戰
- 數據挖掘原理與SPSS Clementine應用寶典
- Hadoop集群與安全
- SAS金融數據挖掘與建模:系統方法與案例解析
- Mastering ROS for Robotics Programming(Second Edition)
- 商業智能工具應用與數據可視化
- Deep Learning with R for Beginners
- Google Cloud Platform for Architects
- 數據庫原理及應用:SQL Server 2016
- 碼上行動:利用Python與ChatGPT高效搞定Excel數據分析