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是双精度的(有道理)。限定的结果
允许它解析正确的实现。再次感谢!