在Swift中将CGFloat转换为CFloat

Ant*_*ist 9 swift

我只是想绕过CGFloat返回值CGRectGetWidth.

override func layoutSubviews()  {
    let roundedWidth = roundf(CGRectGetWidth(self.bounds))
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

'NSNumber' is not a subtype of 'CFloat'.

我想这里有一些基本的东西.roundf走的是一条CFloat作为参数,所以我怎么能转换我CGFloatCFloat进行转换?

更新:

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

在此输入图像描述

Ben*_*ieb 5

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

override func layoutSubviews()  {
    let roundedWidth = round(CGRectGetWidth(self.bounds))
    ...
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*nes 5

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

Swift不允许隐式类型转换.

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


Ant*_*ist 1

由于某种原因,我需要进行显式类型转换才能CDouble使其工作。

let roundedWidth = round(CDouble(CGRectGetWidth(self.bounds)))
Run Code Online (Sandbox Code Playgroud)

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

  • [我的这个问题](http://stackoverflow.com/questions/24184810/should-conditional-compilation-be-used-to-cope-with-difference-in-cgfloat-on-dif)了解更多背景信息关于这里发生的事情。基本上,这是因为 CGFloat 的底层类型会根据您是针对 32 位架构还是 64 位架构进行编译而变化。 (2认同)