很多人第一次接触 Swift 柯里化(Currying)时,往往只记住“把多参数函数改写成一串单参数函数”这一定义,却不容易看出它在代码组织里到底有什么用。本文从最基础的加法函数开始,逐步过渡到字符串前缀判断和日志记录器示例,帮助你理解它在部分应用、复用逻辑和轻量依赖注入中的实际价值。
什么是 Swift 柯里化
柯里化的核心,是把一个原本接收多个参数的函数,转换成一系列每次只接收一个参数的函数。
也就是说,函数第一次调用先接收第一个参数,并返回另一个函数;这个返回的函数再接收下一个参数,直到得到最终结果。这样做的价值不只是语法变化,更重要的是它让“先固定一部分参数、生成更专用的新函数”成为可能。
从加法示例理解柯里化结构
先看一个最简单的例子。下面这个 add 函数先接收一个 Int,然后返回一个“再接收一个 Int 并返回结果”的函数。

func add(_ x: Int) -> (Int) -> Int {
return { y in
return x + y
}
}
// 使用柯里化函数
let addFive = add(5)
print(addFive(3)) // 输出 8
这里可以把调用过程拆开理解:
调用过程是如何拆分的
add(5) 并不会立刻完成“两数相加”这件事,它先返回一个新函数,这个新函数已经记住了 x = 5。随后再调用 addFive(3),才会把第二个参数传进去,最终得到 8。
换句话说,let addFive = add(5) 这一步,本质上是在创建一个“固定第一个参数为 5”的专用函数。
柯里化为什么适合部分应用
柯里化最常见的实际用途,就是部分应用(Partial Application)。当某个函数的一部分参数在多个调用场景里是固定的,就可以先把这部分参数绑定,生成一个更具体、更容易复用的函数。

字符串前缀判断就是一个很典型的例子:
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
这个写法解决了什么问题
如果你的业务里会反复检查字符串是否以 "http" 开头,那么与其每次都重新传入这个前缀,不如先生成一个 hasHttpPrefix 函数。这样做有两个直接好处:
一是减少重复参数,让调用点更简洁;二是把“判断 http 前缀”这件事抽成了一个语义更清楚的函数,代码可读性会更好。
用柯里化做轻量依赖注入
除了复用判断逻辑,柯里化也可以拿来做轻量的依赖注入。思路很简单:先把环境信息、配置项或行为前缀传进去,得到一个已经绑定上下文的新函数,后续直接使用这个专用函数即可。
日志记录器就是一个容易理解的示例:
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.
为什么这能算依赖注入
这里的 prefix 可以看作传给日志函数的一项外部配置。通过先注入 "ERROR" 或 "INFO",你就得到了两个职责明确的新函数:一个专门负责错误日志,一个专门负责信息日志。
这种方式虽然简单,但已经体现出依赖注入的基本思想:把变化的配置提前传入,把执行逻辑保留给后续调用。对模块化和函数复用来说,这种写法往往比把所有参数都堆在每次调用里更清晰。
什么时候适合使用柯里化
如果你遇到下面几类场景,柯里化通常会比较有用:
- 某个函数会被频繁调用,但其中一部分参数经常固定不变。
- 你希望把通用逻辑预先配置成更具体、更易读的函数。
- 你想用较轻量的方式完成配置注入,而不是一开始就引入更复杂的对象封装。
不过也要注意,柯里化并不适合所有代码。对于参数关系本来就很直白、只调用一次的函数,强行改写成柯里化形式,反而可能让代码更绕。是否采用,关键还是看它能不能明显提升复用性和表达力。
总结
Swift 中的柯里化,表面上是在改写函数签名,实际上是在提供一种更灵活的参数组织方式。通过它,你可以先固定部分参数,再生成面向具体场景的新函数。
从 add 的基础示例,到 hasPrefix 的部分应用,再到 logger 的轻量依赖注入,三种写法展示的是同一件事:当参数可以分阶段传入时,函数就能更容易复用,也更容易表达意图。







