1

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

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 中因上述错误而失败

4

1 回答 1

1

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

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

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

func * (a:String, b:Double) -> CGFloat {
    let result: Double =  a * Double(b)
    return CGFloat(result)
}
于 2016-06-14T23:33:16.023 回答