Swift3中模糊的运算符解析回归?

时间:2016-06-14 21:47:56

标签: swift operator-overloading swift3 xcode8

我有值类型来表示持续时间和频率(反向持续时间)。想要用它们做数学运算,我有以下运算符重载:

func * (a:Frequency, b:Duration) -> Double {
    return a.numerator * (b / a.denominator)
}

因为我经常使用图形代码,所以我发现自己经常需要CGFloat响应,而不是Double。所以我添加了以下糖:

func * (a:Frequency, b:Duration) -> CGFloat {
    return CGFloat(a * b)
}

这在Swift2.2中运行良好。编译器似乎根据预期的返回类型找到并应用了适当的一个。但是使用Swift3,似乎不再是这种情况了?我收到Ambiguous use of operator '*'错误。它甚至告诉我它发现了两个候选者,原始函数以及错误的函数。

Swift3中的变化是否可以预料到这一点?这是我以前逃脱的东西,但不应该有吗?还是回归?

更新

您甚至不需要自己的特殊课程来完成此任务。在XCode7游乐场中,以下情况很好:

func * (a:String, b:Double) -> Double {
    return Double(a)! * b
}

func * (a:String, b:Double) -> CGFloat {
    return CGFloat(a * b)
}

let x:CGFloat = "4.2" * 3.0
let y:Double = "-1.1" * 22.2

但是在XCode8

中出现上述错误失败了

1 个答案:

答案 0 :(得分:1)

我认为这是以前版本的编译器中的一个错误。

无法确定是否要使用func * (a:String, b:Double) -> Double func或者它是func * (a:String, b:Double) -> CGFloat的递归调用(是的,有一个CGFloat的构造函数需要一个CGFloat作为参数)。

如果你实现这样的代码(明确你想要哪个函数),编译将能够推断出正确的函数:

func * (a:String, b:Double) -> CGFloat {
    let result: Double =  a * Double(b)
    return CGFloat(result)
}