Swift使用不透明类型时报表达式类型歧义错误的原因及5.5版本兼容性
错误原因
- Swift 5.1 中不透明类型(
some Protocol)的类型推导能力存在限制:返回值为some NumericExpression的函数,对外只暴露「返回值遵循NumericExpression协议」的信息,不会自动暴露内部关联类型TNumeric的具体类型、也不会自动推导多个同返回类型的不透明实例的关联类型等价性。 - 上述代码中的
m1、m2都是返回自multi方法的some NumericExpression类型实例,虽然运行时两者的TNumeric都是Int,但Swift 5.1编译器无法识别这一点,无法满足multi方法要求的「两个参数的TNumeric类型相等」的约束,因此抛出类型歧义错误。
Swift 5.5版本运行情况
该代码场景可以在Swift 5.5及以上版本正常编译运行。Swift 5.2至5.5版本对不透明类型的推导能力做了多处优化,支持对同签名返回的不透明类型实例的关联类型做自动等价匹配,只要两个实例的TNumeric实际类型一致,编译器就能自动满足泛型约束,不会再抛出歧义错误。
如果需要兼容Swift 5.1环境,只需要给变量补充明确的约束提示即可:
// 给m1、m2补充关联类型约束,编译器即可识别约束匹配 var m1: some NumericExpression where Self.TNumeric == Int = Expression.multi(s1, s2) var m2: some NumericExpression where Self.TNumeric == Int = Expression.multi(3, 4) let m3 = Expression.multi(m1, m2) // 编译正常
内容的提问来源于stack exchange,提问作者rtnm
相关产品推荐
相关产品推荐

