应该使用条件编译来应对不同体系结构中CGFloat的差异吗?

Mat*_*son 5 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
Run Code Online (Sandbox Code Playgroud)

(对于那些已经混淆背景信息:CGFloat的是一个"浮动"型的32位体系结构,对于64位体系结构"双"(即编译的目标),这就是为什么只使用的任ceil()ceilf()上也不会总是编译,取决于目标体系结构.请注意,您似乎无法CGFLOAT_IS_DOUBLE用于条件编译,只有架构标志......)

现在,这引起了关于在编译时修复事物与运行时间的评论中的一些争论,等等.我认为,我的回答被接受得太快,无法吸引对此有关的一些好的辩论.

所以,我的新问题:如果你想让你的iOS和OS X代码在32位和64位设备上运行,上面是一个安全,明智的事情吗?如果它理智和明智的,还有更好的(至少是有效的,而不是"icky")解决方案吗?

Jea*_*nan 3

马特,

基于您的解决方案,如果您在多个地方使用它,那么一点点扩展可能会使其更容易接受:

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

其余的代码会更清晰:

var x = CGFloat(0.5)
x.ceil
Run Code Online (Sandbox Code Playgroud)