众所周知,CGFloat(在CoreGraphics,UIKit等中无处不在)可以是32位或64位浮点数,具体取决于处理器架构.
在C中,CGFloat它是一个typealias到float或double,在Swift则它被定义为struct CGFloat具有native属性(其是Float或Double).
已经多次观察到NSNumber可以从被创建并转换为Float和Double,但有从与存在不相似的转换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
转换很简单,可能由编译器优化.
然而,这引起了我的好奇心,如果转换可以做到
无需促进CGFloat到Double32位平台.
可以使用构建配置语句(例如,应该使用条件编译来处理不同体系结构中CGFloat的差异吗?):
extension NSNumber {
convenience init(cgFloatValue value : CGFloat) {
#if arch(x86_64) || arch(arm64) …Run Code Online (Sandbox Code Playgroud)