在Swift中将CGFloat转换为CFloat

时间:2014-06-03 10:06:56

标签: swift

我只想尝试CGFloat的{​​{1}}返回值。

CGRectGetWidth

编译器不会让我,给出错误:

override func layoutSubviews() { let roundedWidth = roundf(CGRectGetWidth(self.bounds)) ... }

我想我在这里缺少一些基本的东西。 'NSNumber' is not a subtype of 'CFloat'roundf为参数,那么如何将CFloat转换为CGFloat进行转换?

更新

现在使用round而不是roundf但我仍然得到相同的错误。我已经尝试清理项目并重新启动Xcode。

enter image description here

4 个答案:

答案 0 :(得分:5)

CGRect成员CGFloats,尽管他们的名字,但实际上是CDoubles。因此,您需要使用round(),而不是roundf()

override func layoutSubviews()  {
    let roundedWidth = round(CGRectGetWidth(self.bounds))
    ...
}

答案 1 :(得分:5)

问题在于CGFloat是平台相关的(就像它在ObjC中一样)。在32位环境中,CGFloat的类型别名为CFloat - 在64位环境中,为CDouble。在ObjC中,如果没有更多迂腐的警告,圆形很高兴消耗你的浮动,并将你的双打完成。

Swift不允许隐式类型转换。

尝试构建iPhone 5和iPhone 5s模拟器,我怀疑你会看到一些差异。

答案 2 :(得分:1)

出于某种原因,我需要对CDouble进行明确的类型转换才能使其正常工作。

let roundedWidth = round(CDouble(CGRectGetWidth(self.bounds)))

我觉得这很奇怪,因为根据定义,CGFloatCDouble。似乎编译器由于某种原因在这里有点困惑。

答案 3 :(得分:1)

CGFloat()适用于我的所有架构。