Swift中具名与位置函数调用差异及报错问题解析
Swift函数参数标签与类型适配问题解析
核心原因:函数类型的隐式转换
你遇到的问题本质是Swift对带外部参数标签的函数和无外部参数标签的函数类型之间的隐式转换规则导致的:
直接调用
add(1,2)报错的原因
你定义的add(x: Int, y: Int)是带外部参数标签的函数,Swift默认要求调用这类函数时必须显式写出参数标签(x:、y:),所以直接用位置参数add(1,2)会触发"Missing argument"错误——因为Swift认为你没提供必要的参数标签。传入wrapper后能正常调用的原因
wrapper的参数类型是(Int, Int) -> Int,这是一个无外部参数标签的函数类型。当你把add传入wrapper时,Swift会自动做隐式转换:剥离add的外部参数标签,把它适配成(Int, Int) -> Int类型的函数。
所以在wrapper内部调用function(1,2)时,实际上调用的是已经被转换后的无标签版本add,自然不需要写参数标签,也就不会报错。
补充验证:强制要求带标签的函数类型
如果想让wrapper必须接受带标签的函数,可以修改wrapper的参数类型:
func wrapper(function: (x: Int, y: Int) -> Int) -> Int { function(x: 1, y: 2) // 必须写参数标签,否则报错 } print(wrapper(function: add)) // 依然可以正常传入add,因为add本身带标签
这时候内部调用就必须显式写参数标签,否则会报错,也能验证之前的转换逻辑。
内容的提问来源于stack exchange,提问作者Valencia
相关产品推荐
相关产品推荐

