尝试在返回 `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
转换为CGFloat
type,因为它是文字,并且没有显式类型,因此将自动转换为CGFloat
无需手动投射。