由于Swift的混乱缺乏CGFloat的隐式转换

时间:2014-06-09 10:17:59

标签: swift types type-conversion cgfloat

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

  

无法找到' /'接受提供的参数

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

还有其他人见过这类问题吗?

4 个答案:

答案 0 :(得分:16)

这是doublefloat转化的问题。

在64位计算机上,CGFloat被定义为double,您可以毫无问题地编译它,因为M_PIx都是双倍的。

在32位计算机上,CGFloatfloat,但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而无需手动转换。