尝试在返回 `CGFloat 的函数中进行算术运算,我得到一个错误:
找不到接受提供的参数的“/”的重载
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (M_PI * (x) / 180.0) // error is here.
}
有没有其他人见过这种类型的问题?
尝试在返回 `CGFloat 的函数中进行算术运算,我得到一个错误:
找不到接受提供的参数的“/”的重载
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (M_PI * (x) / 180.0) // error is here.
}
有没有其他人见过这种类型的问题?
这是转换的double问题float。
在 64 位机器上,CGFloat定义为double并且您将毫无问题地编译它,因为M_PI和x都是双精度的。
在 32 位机器上,CGFloat是 afloat但M_PI仍然是 double。不幸的是,在 Swift 中没有隐式转换,所以你必须显式地转换:
return (CGFloat(M_PI) * (x) / 180.0)
180.0推断文字的类型。
在斯威夫特 3
M_PI已弃用,请CGFloat.pi改用:
return (x * .pi / 180.0)
在这种特殊情况下,我有一个可爱的技巧可以推荐
let π = CGFloat(M_PI)
Unicode 无处不在,π 很容易用Opt+P
最好抽象出复杂性。首先创建一个扩展
extension Double {
/** Converts the specified value in degrees into radians. */
func degrees() -> CGFloat {
return CGFloat(self) * CGFloat(M_PI / 180.0)
}
}
然后在您的代码中使用它,例如以下示例
let angle = 30.0.degrees()
let transform = CGAffineTransformRotate(self.sliderControl.transform, angle);
起初我不愿意扩展 Double,因为我不喜欢创建定制的语言使用(来自 C++ 中的编码恐惧)。然而,实践经验表明这是一种语言自然的抽象方式。
这应该可以修复错误:
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (CGFloat(M_PI) * (x) / 180.0)
}
发生错误的原因是因为x显式声明为 a CGFloat,而M_PI具有 type CDouble,如声明中所示:
var M_PI: CDouble { get } /* pi */
因此,您需要强制M_PI转换为 typeCGFloat以便它匹配的类型x(正如我在上面的代码中所做的那样)。这样,对不同类型的操作就不会发生冲突。
请注意,与其他答案中所述(以及@Cezar 评论)相反,您不需要显式180.0转换为CGFloattype,因为它是文字,并且没有显式类型,因此将自动转换为CGFloat无需手动投射。