10

尝试在返回 `CGFloat 的函数中进行算术运算,我得到一个错误:

找不到接受提供的参数的“/”的重载

func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{ 
     return (M_PI * (x) / 180.0) // error is here. 
}

有没有其他人见过这种类型的问题?

4

4 回答 4

17

这是转换的double问题float

在 64 位机器上,CGFloat定义为double并且您将毫无问题地编译它,因为M_PIx都是双精度的。

在 32 位机器上,CGFloat是 afloatM_PI仍然是 double。不幸的是,在 Swift 中没有隐式转换,所以你必须显式地转换:

return (CGFloat(M_PI) * (x) / 180.0)

180.0推断文字的类型。

在斯威夫特 3

M_PI已弃用,请CGFloat.pi改用:

return (x * .pi / 180.0)
于 2014-06-09T10:24:37.243 回答
11

在这种特殊情况下,我有一个可爱的技巧可以推荐

let π = CGFloat(M_PI)

Unicode 无处不在,π 很容易用Opt+P

于 2014-07-03T12:53:39.100 回答
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++ 中的编码恐惧)。然而,实践经验表明这是一种语言自然的抽象方式。

于 2014-12-14T11:19:37.150 回答
0

这应该可以修复错误:

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无需手动投射。

于 2014-06-09T10:21:54.760 回答