我有值类型来表示持续时间和频率(反向持续时间)。想要用它们做数学运算,我有以下运算符重载:
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
中出现上述错误失败了答案 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)
}