我有值类型来表示持续时间和频率(反转持续时间)。想和他们一起做数学,我有以下运算符重载:
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 中因上述错误而失败