柯里化(Currying)
在 Swift 中,柯里化(Currying)是指将一个多参数函数转换为一系列单参数函数的过程。 这样,每次调用函数时只传入一个参数,返回一个新的函数,该函数接收下一个参数
1. 简单的柯里化函数
假设我们有一个接受两个整数参数并返回它们和的函数,可以通过柯里化将其转换成一系列单参数函数
func add(_ x: Int) -> (Int) -> Int {
return { y in
return x + y
}
}
// 使用柯里化函数
let addFive = add(5)
print(addFive(3)) // 输出 8
2. 柯里化特别适合用于部分应用。例如,如果我们有一个函数用于检查字符串是否具有指定的前缀
func hasPrefix(_ prefix: String) -> (String) -> Bool {
return { string in
return string.hasPrefix(prefix)
}
}
// 创建一个带特定前缀的检查函数
let hasHttpPrefix = hasPrefix("http")
// 使用这个函数
print(hasHttpPrefix("http://example.com")) // 输出 true
print(hasHttpPrefix("https://example.com")) // 输出 true
print(hasHttpPrefix("ftp://example.com")) // 输出 false
3. 通过柯里化,我们可以用部分应用(Partial Application)实现依赖注入,从而构建模块化、灵活的函数。
示例:日志记录器的依赖注入
假设我们有一个简单的日志记录器,需要传入不同的日志前缀
func logger(prefix: String) -> (String) -> Void {
return { message in
print("\(prefix): \(message)")
}
}
let errorLogger = logger(prefix: "ERROR")
let infoLogger = logger(prefix: "INFO")
errorLogger("File not found.") // 输出: ERROR: File not found.
infoLogger("User logged in.") // 输出: INFO: User logged in.