一尘不染

是否应使用条件编译来解决不同体系结构上CGFloat的差异?

swift

在回答这个关于ceil()在CGFloat上为所有架构进行编译的早期问题时,我提出了以下解决方案:

    var x = CGFloat(0.5)

    var result: CGFloat

    #if arch(x86_64) || arch(arm64)
        result = ceil(x)
    #else
        result = ceilf(x)
    #endif

    // use result

(针对那些已经感到困惑的人的背景信息:对于32位架构,CGFloat是“ float”类型,对于64位架构(即,编译目标),CGFloat是“
double”,这就是为什么仅使用其中之一ceil()ceilf()不使用它的原因编译,具体取决于目标体系结构。请注意,您似乎无法CGFLOAT_IS_DOUBLE用于条件编译,只能使用体系结构标志…)

现在,有关在编译时与运行时修复问题等等的评论吸引了一些辩论。我认为我的回答被接受的太快了,以至于不能引起对此的一些好的辩论。

因此,我的新问题是:如果您希望iOS和OS X代码在32位和64位设备上运行,那么上述操作是安全,明智的做法吗?而且,如果这
理智而明智的,那么还有没有更好的解决方案(至少有效,而不是“棘手的”)?


阅读 193

收藏
2020-07-07

共1个答案

一尘不染

马特

基于您的解决方案,并且如果您在多个地方使用它,那么稍加扩展可能会使它更可口:

extension CGFloat {
    var ceil: CGFloat {
        #if arch(x86_64) || arch(arm64)
            return ceil(x)
        #else
            return ceilf(x)
        #endif
    }
}

其余代码将更加简洁:

var x = CGFloat(0.5)
x.ceil
2020-07-07