Swift3中的模糊运算符分辨率回归?

Swift3中的模糊运算符分辨率回归?,swift,operator-overloading,swift3,xcode8,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 {

我有值类型来表示持续时间和频率(反向持续时间)。为了与它们进行数学运算,我有以下操作符重载:

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,情况似乎不再如此了?我得到一个
运算符“*”的模糊用法
错误。它甚至告诉我它找到了两个候选函数,原始函数和出错函数

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错误而失败,我认为这是以前版本的编译器中的一个错误

无法确定是要使用
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)
}

你是说双(a)*b@LeoDabus不,使用
Double(a)
将产生相同的问题。您甚至不需要
Double(b)
。似乎已经知道b是双精度的(有道理)。限定的
结果
允许它解析正确的实现。再次感谢!