为什么Swift代码中函数的参数标签在此特定场景下会失去作用?
核心原因
你对「参数标签属于函数签名」的理解仅适用于函数声明阶段的重载匹配场景,当函数被当做值处理时,Swift 允许隐式将带参数标签的函数类型转换为无标签的函数类型,只要参数的数量、数据类型、返回值类型完全匹配即可。
第二个示例的运行逻辑
g的声明类型为(foo: String) -> String,h的声明类型为(bar: String) -> String- 编译器处理三目表达式
0 < 100 ? g : h时,会结合后续的无标签调用("hello")推导表达式的目标类型为无标签的(String) -> String - 由于
g和h都可以隐式转换为该目标类型,因此编译可以通过 - 三目条件为真时取
g执行,所以返回结果为"foo"
你可以通过显式指定类型验证规则的一致性:如果强制要求三目表达式返回带标签的函数类型,代码会直接报错,符合「参数标签属于函数类型」的规则:
// 编译报错:Cannot convert value of type '(bar: String) -> String' to specified type '(foo: String) -> String' let fn: (foo: String) -> String = 0 < 100 ? g : h
第三个示例的歧义来源
当你新增了 h 的重载后,h 本身存在两个可匹配的类型:
(bar: String) -> String(foo: String) -> String
两个类型都可以隐式转换为无标签的(String) -> String,编译器无法判断应该选取哪个h重载和g匹配,因此直接抛出歧义错误。
内容的提问来源于stack exchange,提问作者Matthew Butterick
相关产品推荐
相关产品推荐

