You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读《Advanced Swift》时对Swift中String.localizedStandardCompare语法的困惑

关于String.localizedStandardCompare("a")("b")语法的解释

嘿,这个语法看起来有点绕,但其实是Swift里一个挺有意思的特性——实例方法的柯里化在起作用!我给你一步步拆解清楚:

先明确方法的本质

你提到的方法声明是:

func localizedStandardCompare<T>(_ string: T) -> ComparisonResult where T : StringProtocol

这是String的实例方法,正常的调用方式是"a".localizedStandardCompare("b")——这里"a"是方法的self(也就是调用该方法的字符串实例),"b"是方法的参数string。

为什么String.localizedStandardCompare("a")("b")能等价工作?

在Swift中,所有实例方法都可以被看作是所属类型的柯里化函数。换句话说,当你直接用类型(比如String)去引用它的实例方法时,这个方法的签名会悄悄发生变化:
它从原本的「接收一个StringProtocol参数,返回ComparisonResult」,变成了「先接收一个String实例(即原来的self),返回一个新函数;这个新函数再接收一个StringProtocol参数,最终返回ComparisonResult」。

用类型签名来表示的话,就是从:

(T) -> ComparisonResult where T : StringProtocol

变成了:

(String) -> (T) -> ComparisonResult where T : StringProtocol

所以String.localizedStandardCompare("a")其实是把"a"作为self传入,得到了一个等待接收第二个参数的函数;接着调用这个函数传入"b",就和"a".localizedStandardCompare("b")的效果完全一致了。

举个更简单的例子辅助理解

我们自己定义一个字符串扩展方法:

extension String {
    func addSuffix(_ suffix: String) -> String {
        return self + suffix
    }
}

正常调用是"Hi".addSuffix(" there!"),结果是"Hi there!"。
而用柯里化的写法就是String.addSuffix("Hi")(" there!"),返回的结果完全相同!

这种写法在函数式编程场景下偶尔会用到,但日常开发里还是实例调用的写法更直观易懂~

内容的提问来源于stack exchange,提问作者echo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:23:20