gpt4 book ai didi

swift - Swift3 中不明确的运算符分辨率回归?

转载 作者:行者123 更新时间:2023-11-28 06:41:40 25 4
gpt4 key购买 nike

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

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 playground 中,以下内容很好:

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)
}

关于swift - Swift3 中不明确的运算符分辨率回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com