Swift中带默认参数的无标签重载函数调用歧义问题求解
解决Swift无标签默认参数重载的歧义问题
当你定义了两个带无标签默认参数的重载函数时:
func foo(_ s: String = "") { print("foo with s") } func foo(_ f: Float = 0) { print("foo with f") }
直接用foo(_:)()会触发编译器歧义错误,你可以通过以下几种方式让编译器识别目标函数:
方法一:显式传入匹配类型的参数
哪怕使用默认值,只要明确参数类型就能区分:
foo("") // 调用String版本 foo(0.0) // 调用Float版本
方法二:通过类型强制转换指定目标函数
直接在调用时对函数进行类型标注,明确你要调用的版本:
(foo as (String) -> Void)() // 调用String版本 (foo as (Float) -> Void)() // 调用Float版本
方法三:将函数引用赋值给明确类型的变量
先把目标函数赋值给指定类型的变量,再调用这个变量:
let stringFoo: (String) -> Void = foo stringFoo() // 调用String版本 let floatFoo: (Float) -> Void = foo floatFoo() // 调用Float版本
方法四:修改函数定义,添加参数标签
从根源避免歧义,给其中一个函数添加专属参数标签:
// 修改后的函数定义 func foo(_ s: String = "") { print("foo with s") } func foo(float f: Float = 0) { print("foo with f") } // 调用方式 foo(_:)() // String版本 foo(float:)() // Float版本
内容的提问来源于stack exchange,提问作者iUrii
相关产品推荐
相关产品推荐

