尝试在返回`CGFloat的函数中进行算术运算,我得到一个错误:
无法找到' /'接受提供的参数
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (M_PI * (x) / 180.0) // error is here.
}
还有其他人见过这类问题吗?
答案 0 :(得分:16)
这是double
到float
转化的问题。
在64位计算机上,CGFloat
被定义为double
,您可以毫无问题地编译它,因为M_PI
和x
都是双倍的。
在32位计算机上,CGFloat
为float
,但M_PI
仍为双倍。不幸的是,Swift中没有隐式转换,所以你必须明确地转换:
return (CGFloat(M_PI) * (x) / 180.0)
推断出180.0
文字的类型。
在Swift 3中
不推荐使用 M_PI
,而是使用CGFloat.pi
:
return (x * .pi / 180.0)
答案 1 :(得分:11)
在这个具体案例中,我有一个可爱的伎俩推荐
let π = CGFloat(M_PI)
无处不在的Unicode,π很容易用 Opt + P
答案 2 :(得分:1)
最好抽象出复杂性。首先创建一个扩展
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 ++中的编码恐怖)。然而,实践经验表明这是一种自然的抽象方式。
答案 3 :(得分:0)
这应该可以解决错误:
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (CGFloat(M_PI) * (x) / 180.0)
}
发生错误的原因是x
被明确声明为CGFloat
,而M_PI
的类型为CDouble
,如声明中所示:< / p>
var M_PI: CDouble { get } /* pi */
因此,您需要将M_PI
转换为CGFloat
类型,以便它与x
的类型相匹配(正如我在上面的代码中所做的那样)。这样,在不同类型的操作上就没有冲突。
请注意,与其他答案(以及@Cezar评论)中所述相反,您不需要明确地将180.0
投射到CGFloat
类型,因为它是文字,并且没有明确的类型,所以会自动转换为CGFloat
而无需手动转换。