读《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

