Xcode 12.5函数重载出现.zero歧义调用问题的原因及解决方案咨询
行为变更原因
Xcode 12.5 内置 Swift 5.4 版本,其发版说明中对应调整条目为:修正了枚举点语法与同名类型静态属性的优先级判断规则。当多个重载函数的参数分别可匹配枚举成员、同名字面量/静态属性时,编译器不再隐式优先匹配枚举类型,将直接抛出歧义错误,要求开发者显式指定类型以消除二义性。
本次报错的本质是 CGFloat 本身自带静态属性 .zero,与你定义的 Test 枚举的 .zero 成员在隐式类型推断场景下,均符合两个重载函数的入参要求,Swift 5.4 版本取消了之前版本对枚举类型的隐式优先级,因此出现报错。
复现代码
枚举定义:
enum Test: CGFloat { case zero }
重载函数定义:
func test(_ param: CGFloat) { print("param - \(param)") } func test(_ param: Test) { print("param - \(param.rawValue)") }
问题调用示例:
test(Test.zero) // 正常输出"param - 0" test(.zero) // 报错:ambiguous use of .zero
修复方案
- 方案1:优化API设计,显式指定调用时的类型,避免依赖编译器隐式推断。比如调用时写全
test(Test.zero),也可以调整重载函数的参数标签,从根源上避免命名冲突。 - 方案2:给优先级更低的重载添加
@_disfavoredOverload注解,编译器会优先选择没有该注解的重载。示例如下:
// 给CGFloat入参的重载添加注解,降低其匹配优先级 @_disfavoredOverload func test(_ param: CGFloat) { print("param - \(param)") }
添加注解后调用test(.zero)会默认匹配Test类型的重载,不会再抛出歧义错误。
内容的提问来源于stack exchange,提问作者Vlad Z.
相关产品推荐
相关产品推荐

