相关疑难解决方法(0)

在Swift中收集CGFloat

我怎样才能在Swift中收集CGFloat?我试过ceil(CDouble(myCGFloat))但只适用于iPad Air和iPhone 5S.

当在另一个模拟设备上运行时,我收到错误消息 'NSNumber' is not a subtype of 'CGFloat'

rounding cgfloat ceil swift

73
推荐指数
6
解决办法
7万
查看次数

在Swift中将CGFloat转换为CFloat

我只是想绕过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.

在此输入图像描述

swift

9
推荐指数
3
解决办法
3625
查看次数

CGFloat和NSNumber之间的转换没有不必要的升级到Double

众所周知,CGFloat(在CoreGraphics,UIKit等中无处不在)可以是32位或64位浮点数,具体取决于处理器架构.

在C中,CGFloat它是一个typealias到floatdouble,在Swift则它被定义为struct CGFloat具有native属性(其是FloatDouble).

已经多次观察到NSNumber可以从被创建并转换为FloatDouble,但有从与存在不相似的转换CGFloat.一般建议(例如在Swift中将CGFloat转换为NSNumber)是通过转换Double

CGFloat <--> Double <--> NSNumber
Run Code Online (Sandbox Code Playgroud)

例:

let c1 = CGFloat(12.3)
let num = NSNumber(double: Double(c1))
let c2 = CGFloat(num.doubleValue)
Run Code Online (Sandbox Code Playgroud)

这很简单,也没有精确度.此外,大多数平台现在都是64位,然后CGFloat/Double 转换很简单,可能由编译器优化.

然而,这引起了我的好奇心,如果转换可以做到 无需促进CGFloatDouble32位平台.

可以使用构建配置语句(例如,应该使用条件编译来处理不同体系结构中CGFloat的差异吗?):

extension NSNumber {
    convenience init(cgFloatValue value : CGFloat) {
        #if arch(x86_64) || arch(arm64) …
Run Code Online (Sandbox Code Playgroud)

nsnumber cgfloat swift

5
推荐指数
1
解决办法
4501
查看次数

标签 统计

swift ×3

cgfloat ×2

ceil ×1

nsnumber ×1

rounding ×1